关于Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
,有没有办法查看 SQL Server 使用什么机制来计算由创建的表的新标识值SELECT INTO
?
样本数据
-- Create our base table
CREATE TABLE dbo.A
(A_ID INT IDENTITY(1, 1),
x1 INT,
noise1 int DEFAULT 1,
noise2 char(1) DEFAULT 'S',
noise3 date DEFAULT GETUTCDATE(),
noise4 bit DEFAULT 0);
-- Create random data between the range of [0-3]
INSERT INTO dbo.A(x1)
SELECT s1000.n FROM
( SELECT TOP (10) n = 1 FROM sys.columns) AS s10 -- 10
CROSS JOIN
( SELECT TOP …
Run Code Online (Sandbox Code Playgroud) 在最后一天更新表中的列时,我们的高级 DBA 向我展示了一种减少读取和争用的新技术。
伪代码是
WHILE
[always true condition]
BEGIN
UPDATE [...]
IF @@ROWCOUNT = 0 BREAK;
END
Run Code Online (Sandbox Code Playgroud)
但是,在运行此程序时,我不小心将“包含实际执行计划”留在了“消息”选项卡中,因此我看到重复出现此情况:
(1000 row(s) affected)
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
但是代码有效并且 WHILE 循环有效!
我的问题是,如果包括实际执行计划返回 1 行受影响,这不应该创建一个无限循环吗?
为什么没有被计算在内?
示例表如下:
USE [tempdb];
GO
CREATE TABLE [dbo].[UpdateMePlease]
([ID] INT IDENTITY(1, 1), [UselessNote] VARCHAR(10) DEFAULT 'Delete me!', [UpdateValue] VARCHAR(10) NULL)
GO
INSERT INTO [dbo].[UpdateMePlease] ([UselessNote]) DEFAULT VALUES;
GO 10000
SELECT * FROM [dbo].[UpdateMePlease];
/* turn Actual Execution Plan on here */
WHILE 1 = 1 BEGIN
UPDATE TOP (1000) [dbo].[UpdateMePlease] …
Run Code Online (Sandbox Code Playgroud) 我有一个联系人(ID、名字、姓氏、中间名)。
例如:
| ID | FirstName | LastName | MiddleName |
|====|===========|==========|============|
| 1 | Mark |Jordan | E |
|----|-----------|----------|------------|
| 2 | James | Blunt | NULL |
|----|-----------|----------|------------|
Run Code Online (Sandbox Code Playgroud)
我要输出
Mark E. Jordan
James Blunt
Run Code Online (Sandbox Code Playgroud)
因此,如果 MiddleName 不为空,则添加一个 '.' 之后,否则输出空值。
我知道isnull
函数,但是我需要的是isnotnull
函数。如何完成查询?
到目前为止我的查询:
select FirstName + ' ' + isnull(...) + LastName
from Contact
Run Code Online (Sandbox Code Playgroud)