找不到行时,SET @Var = SELECT(...)会导致什么?

时间:2018-08-16 16:03:35

标签: sql sql-server

在存储过程中,我有以下代码:

@tn nvarchar(256)

[...]

DECLARE @Var1 int;

SET @Var1 = (SELECT tid FROM t1 WHERE tn = @tn);

IF @Var1 IS NULL
    BEGIN
        --- do something
    END

我是否正确假设如果SELECT语句未找到任何记录,则@ Var1将设置为NULL?

我正在使用SQL Server 2012。

我发布问题的原因是我遇到了一种情况,即记录不存在但@ Var1不为NULL(即BEGIN / END之间的代码未执行)。

1 个答案:

答案 0 :(得分:3)

该代码无法正常工作,请尝试:

USE Sandbox;
GO

CREATE TABLE dbo.TestTable (ID int);
INSERT INTO dbo.TestTable (ID)
VALUES(1),(3);
GO
DECLARE @V int;

SET @V = SELECT (ID FROM dbo.TestTable WHERE ID = 3);

GO
DROP TABLE dbo.TestTable;

您会得到错误:

Msg 156, Level 15, State 1, Line 10
Incorrect syntax near the keyword 'SELECT'.
Msg 156, Level 15, State 1, Line 10
Incorrect syntax near the keyword 'FROM'.

语法应为:

SET @V = (SELECT ID FROM dbo.TestTable WHERE ID = 3);

然后,您可以轻松找到答案:

USE Sandbox;
GO

CREATE TABLE dbo.TestTable (ID int);
INSERT INTO dbo.TestTable (ID)
VALUES(1),(3);
GO
DECLARE @V int;

SET @V = (SELECT ID FROM dbo.TestTable WHERE ID = 2);

SELECT @V; --Returns NULL

GO
DROP TABLE dbo.TestTable;

您甚至可以在它之前声明,结果将是相同的,例如:

DECLARE @V int;

SET @V = (SELECT ID FROM dbo.TestTable WHERE ID = 3);
SET @V = (SELECT ID FROM dbo.TestTable WHERE ID = 2);

SELECT @V;

第二个表达式返回NULL时,仍将返回NULL。