在存储过程中,我有以下代码:
@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之间的代码未执行)。
答案 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。