是否有任何工具可与SSMS Tools Pack 2012相媲美?许可(每台机器 30 美元,任意数量的机器 100 美元……3 个月)还有很多不足之处,我不确定还有哪些其他选项可用。
例如,我真正怀念的一件事是“保存您运行的每个查询”。在修修补补和研究时,在运行不同版本的查询时进行备份是非常宝贵的。或者当我意识到我没有 2 个月前正在处理的查询的备份时。
说明:SQL Server Management Studio 没有官方插件支持,但有一些工具。SSMS Tools Pack 是我非常喜欢的一个(2005、2008 版本),但是 2012 年的许可费太可怕了。(我会为合理的许可证付费,但这不是这里的问题。)
例如,我发现SSMS Boost对SSMS有一些很酷的补充,这似乎是值得的。
SQL Server 2012 还有哪些其他插件可用?我希望有一些东西可以在我点击 F5 时像 SSMS 工具包那样保存查询,或者除了列出的两个工具之外的任何东西?
create table T(ID int identity primary key)
insert into T default values
insert into T default values
go
select cast(ID as varchar(10)) as ID
from T
where ID = 1
Run Code Online (Sandbox Code Playgroud)
上面的查询在查询计划中有一个警告。
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" />
</Warnings>
Run Code Online (Sandbox Code Playgroud)
为什么它有警告?
字段列表中的强制转换如何影响基数估计?
sql-server execution-plan type-conversion sql-server-2012 cardinality-estimates
在另一个应用程序中,我被糟糕的设计震惊了:多个线程EnsureDatabaseSchemaExists()同时执行一个方法,它看起来基本上是这样的:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Run Code Online (Sandbox Code Playgroud)
但是,即使在 SERIALIZABLE 事务中执行,此代码似乎也不是线程安全的(即并行代码尝试多次创建表)。是否有机会强制 SELECT 语句获取阻止另一个线程执行相同 SELECT 语句的锁?
是否有更好的多线程 EnsureSchemaExists() 方法模式?
我一直在一个表中记录昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域。
然而,现在已经到了查询计划占用太多空间的地步(因为我们针对每个查询存储整个计划)。
因此,我试图通过将 QueryPlanHash 和 QueryPlan 提取到另一个表来规范化现有数据。
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Run Code Online (Sandbox Code Playgroud)
由于query_plan_hashin的定义sys.dm_exec_query_stats是一个二进制字段(并且我会定期插入新数据),因此我使用VARBINARY了新表中的数据类型。
但是,下面的插入失败了...
INSERT INTO QueryPlans
( QueryPlanHash, QueryPlan )
SELECT queryplanhash, queryplan
FROM
(
SELECT
p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash,
QueryPlan,
ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum
FROM table
CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1
Run Code Online (Sandbox Code Playgroud)
....有错误
Implicit conversion from data type varchar to varbinary is …Run Code Online (Sandbox Code Playgroud) 我有敏感的价格列,我只想通过存储过程进行更新。如果不使用旨在更新它的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都失败。
我正在考虑使用触发器和令牌表来实现这一点。我正在考虑的想法是有一个令牌表。存储过程必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查更新行的令牌表中是否存在该令牌。如果找到,它将继续。如果未找到令牌,则会抛出异常并使更新事务失败。
有没有好的/更好的方法来实现这个限制?
我将拥有一个 SQL Server 2012 数据库和一个包含 300 万行和 50 列的表。无人值守后台 .net 进程(可能发出一些 SQL 或 Powershell 命令)将其导出到文本文件的最快方法是什么,每行数据一行?.net 进程应该知道导出何时完成或是否有任何错误。数据类型将为 allint或nvarchar。
我假设纯 C# 代码使用 ado.net 执行select *命令并循环遍历数据读取器并为每个记录写入文件会很慢,我无法并行化它。
理想情况下,将导出到远程共享网络文件夹,而不是 SQL Server 计算机上的本地文件夹。SQL Server 将是一个 HA 群集。SSIS 是否更适合于此,不需要数据转换?
.Net 进程将在机器 A 上运行,在机器 B 上运行 SQL Server,最终文件目的地是网络共享。一种选择是 SQL 服务器将文件直接写入网络共享。另一个选项是 SQL Server 写入机器 A,然后在写入文件时,.net 进程将其复制到网络共享。我没有正式的 SLA,但预计文件写入需要 30 分钟 - 1 小时。
我们正在使用带有唯一标识符的 SQL Server 2012,我们注意到在执行选择时在末尾添加了额外的字符(所以不是 36 个字符),它仍然返回与 UUID 的匹配项。
例如:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8'
Run Code Online (Sandbox Code Playgroud)
返回带有 uuid 的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8。
但是如果你运行:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'
Run Code Online (Sandbox Code Playgroud)
它还返回带有 uuid 的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8。
SQL Server 在进行选择时似乎忽略了 36 以外的所有字符。这是错误/功能还是可以配置的东西?
这不是一个大问题,因为我们在前端验证了长度,但对我来说这似乎不是正确的行为。
我有一个对数据库具有以下权限的 SQL 帐户:

db_executor您看到此帐户所属的角色是由以下脚本创建的:
CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO
GRANT EXECUTE TO [db_executor]
GO
Run Code Online (Sandbox Code Playgroud)
当我运行一个select,update,insert或delete放在桌子上,它工作正常。当我尝试truncate桌子时,它给了我这个错误信息:
找不到对象“TableName”,因为它不存在或您没有权限。
此帐户缺少什么权限?
我正在尝试更改表中的列。现有的表是这样的:
CREATE TABLE [dbo].[table](
[id1] [int] NOT NULL,
[id2] [int] NOT NULL,
[id3] [int] NOT NULL,
[name] [nvarchar](255) NOT NULL,
[id4] [int] NOT NULL,
[xmlData] [xml](CONTENT [dbo].[xml_schema]) NULL,
[booleanData1] [bit] NOT NULL,
[notes] [varchar](4096) NULL,
[id5] [int] NULL,
[booleanData2] [bit] NULL,
[id6] [int] NULL,
CONSTRAINT [PK_table] PRIMARY KEY CLUSTERED
([id1] ASC, [id2] ASC, [id3] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
现在我试图在这个表上执行这个 sql:
ALTER TABLE [table] ALTER COLUMN [xmlData] XML
Run Code Online (Sandbox Code Playgroud)
这样我就可以删除 xml 模式并用新的模式替换它。
但我收到此错误:
无法创建大于允许的最大行大小 8060 的大小为 8074 的行。
谁能告诉我这里有什么问题?
sql-server ssms sql-server-2012 connectivity sql-server-2014
sql-server ×10
sql-server-2012 ×10
ssms ×2
t-sql ×2
connectivity ×1
export ×1
locking ×1
permissions ×1
trigger ×1
truncate ×1
varbinary ×1
varchar ×1
xml ×1