是否可以禁用一批命令的触发器,然后在批处理完成后启用它?
我确信我可以放下触发器并重新添加它,但我想知道是否还有其他方法.
我正在尝试确定两个不同查询的相对性能,并且有两种方法可以测量这个:
1.运行两个和每个查询的时间
2.运行两个并从实际执行计划中获取"查询成本"
这是我为查询定时运行的代码...
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO
Run Code Online (Sandbox Code Playgroud)
我得到的是以下内容:
Stored_Proc Execution_Time Query Cost (Relative To Batch)
test_1a 1.673 seconds 17%
test_1b 1.033 seconds 83%
Run Code Online (Sandbox Code Playgroud)
执行时间的结果直接与查询成本的结果相矛盾,但我很难确定"查询成本"实际意味着什么.我最好的猜测是它是Reads/Writes/CPU_Time/etc的集合,所以我想我有几个问题:
有没有明确的来源来解释这项措施的含义?
人们使用什么其他"查询性能"指标,它们的相对优点是什么?
值得注意的是,这是一个中型SQL Server,在MS Server 2003 Enterprise Edition上运行MS SQL Server 2005,具有多个处理器和100多个并发用户.
编辑:
经过一番麻烦后,我设法在该SQL Server上获得了Profiler访问权限,并且可以提供额外的信息(支持查询成本与系统资源相关,而不是执行时间本身...)
Stored_Proc …Run Code Online (Sandbox Code Playgroud) sql sql-server optimization sql-server-2005 sql-execution-plan
我有一个UNIQUE, NON CLUSTERED表的索引,目前使用4列索引.
我想创建一个只能向该索引添加另一列的alter脚本.新列类型是varchar.
该数据库是SQL Server 2005.
提前致谢.
我想将我的大型SSMS(SQL Server Management Studio)查询结果(2.5米行,9个字段)导出为.csv或逗号分隔的.txt(带标题).(MS SQL Server 2005 Management Studio.)
这样我就可以逐行读入VBA程序(对数据进行某些计算)或在Excel中对它进行查询(例如使用Microsoft Query).计算很复杂,我更喜欢在SSMS之外的其他地方进行.
如果我在SSMS中选择"查询结果到文本"和一个小答案(几行,例如高达200k),我当然可以简单地复制并粘贴到文本编辑器中.对于我在这里的大答案,我当然可以一次复制和粘贴200k左右的行10次,进入像Ultra-Edit这样的文本编辑器.(当我一次尝试所有2.5米时,我在SSMS内部得到了一个内存警告.)但是对于未来我想要一个更优雅的解决方案.
对于"查询结果到文件",SSMS始终写入.rpt文件.(右键单击结果窗口并选择"另存为"时,它会像上面一样给出内存错误.)
- >所以看起来我唯一的选择就是让SSMS将其结果输出到文件,即.rpt,然后将.rpt转换为.txt.
我假设这个.rpt是一个Crystal Reports文件?或者不是.我的电脑上没有Crystal Reports,因此无法使用它来转换文件.
在Ultra-Edit中打开.rpt时看起来很好.但是在Excel中的Microsoft Query中,标题不想显示.
当我简单地使用VBA读取和写入.rpt时,文件大小减半.(330meg至180meg).在Microsoft Query中,标题现在显示(尽管第一个字段名称有一个有趣的主角,这在我之前在其他完全不同的情况下发生过).我似乎能够在Excel中对它进行有意义的数据透视表.
但是当我在Ultra-Edit中打开这个新文件时,会显示中文字符!在某处还能有一些有趣的角色吗?
- >是否有可用的免费(和简单/安全)转换器应用程序.或者我应该相信这个.txt可以读入我的VBA程序.
谢谢
How do you say以下Microsoft SQL Server 2005:
IF EXISTS (SELECT * FROM Table WHERE FieldValue='') THEN
SELECT TableID FROM Table WHERE FieldValue=''
ELSE
INSERT INTO TABLE(FieldValue) VALUES('')
SELECT TableID FROM Table WHERE TableID=SCOPE_IDENTITY()
END IF
Run Code Online (Sandbox Code Playgroud)
我要做的是查看是否已经有一个空白的fieldvalue,如果有则返回TableID,否则插入一个空白的fieldvalue并返回相应的主键.
我想知道如何读取xml数据并将其转换为TSQL中的表?
例如:
<row>
<IdInvernadero>8</IdInvernadero>
<IdProducto>3</IdProducto>
<IdCaracteristica1>8</IdCaracteristica1>
<IdCaracteristica2>8</IdCaracteristica2>
<Cantidad>25</Cantidad>
<Folio>4568457</Folio>
</row>
<row>
<IdInvernadero>3</IdInvernadero>
<IdProducto>3</IdProducto>
<IdCaracteristica1>1</IdCaracteristica1>
<IdCaracteristica2>2</IdCaracteristica2>
<Cantidad>72</Cantidad>
<Folio>4568457</Folio>
</row>
Run Code Online (Sandbox Code Playgroud)
至
8 3 8 8 25 4568457
3 3 1 2 72 4568457
Run Code Online (Sandbox Code Playgroud) 我的表看起来像这样:
group date cash checks
1 1/1/2013 0 0
2 1/1/2013 0 800
1 1/3/2013 0 700
3 1/1/2013 0 600
1 1/2/2013 0 400
3 1/5/2013 0 200
Run Code Online (Sandbox Code Playgroud)
- 不需要现金只是证明该表中有更多信息
我想得到每个唯一的组,其中日期是最大值,检查大于0.所以返回看起来像这样:
group date checks
2 1/1/2013 800
1 1/3/2013 700
3 1/5/2013 200
Run Code Online (Sandbox Code Playgroud)
尝试代码:
SELECT group,MAX(date),checks
FROM table
WHERE checks>0
GROUP BY group
ORDER BY group DESC
Run Code Online (Sandbox Code Playgroud)
问题虽然它给了我所有的日期和检查,而不仅仅是最大日期行.
使用ms sql server 2005
如何更改列以删除默认值?
该列创建时使用:
ALTER table sometable Add somecolumn nchar(1) NOT NULL DEFAULT 'N'
Run Code Online (Sandbox Code Playgroud)
然后改为:
alter table sometable alter column somecolumn nchar(1) null
Run Code Online (Sandbox Code Playgroud)
这允许空值,但默认值仍然存在.你怎么能删除它?
如何轻松地将blob插入varbinary(MAX)字段?
为了论证:
假设我要插入的东西是:c:\ picture.png表是mytable,列是mypictureblob,地方是recid = 1
我一直在谷歌搜索一段时间,我找不到一个简单的解决方案
谢谢!
在SQL Server 2005中执行原子"UPSERT"(在哪里存在UPDATE,否则为INSERT)的正确模式是什么?
我在SO上看到了很多代码(例如,请参阅检查是否存在行,否则插入),其中包含以下两部分模式:
UPDATE ...
FROM ...
WHERE <condition>
-- race condition risk here
IF @@ROWCOUNT = 0
INSERT ...
Run Code Online (Sandbox Code Playgroud)
要么
IF (SELECT COUNT(*) FROM ... WHERE <condition>) = 0
-- race condition risk here
INSERT ...
ELSE
UPDATE ...
Run Code Online (Sandbox Code Playgroud)
其中<condition>将是对自然键的评估.上述方法似乎都不能很好地处理并发问题.如果我不能拥有两个具有相同自然键的行,则似乎所有上述风险都会在竞争条件场景中插入具有相同自然键的行.
我一直在使用以下方法,但我很惊讶不要在人们的回复中看到它,所以我想知道它有什么问题:
INSERT INTO <table>
SELECT <natural keys>, <other stuff...>
FROM <table>
WHERE NOT EXISTS
-- race condition risk here?
( SELECT 1 FROM <table> WHERE <natural keys> )
UPDATE ...
WHERE <natural keys>
Run Code Online (Sandbox Code Playgroud)
请注意,此处提到的竞争条件与早期代码中的竞争条件不同.在早期的代码中,问题是幻读(在UPDATE/IF之间或在另一个会话的SELECT/INSERT之间插入行).在上面的代码中,竞争条件与DELETE有关.在(WHERE NOT EXISTS)执行之后但在INSERT执行之前,是否有可能由另一个会话删除匹配的行?目前还不清楚WHERE …
sql-server-2005 ×10
sql-server ×6
sql ×5
t-sql ×4
alter ×1
atomic ×1
blob ×1
indexing ×1
optimization ×1
rpt ×1
ssms ×1
upsert ×1
xml ×1