请参阅以下代码:
create table #Person (id int)
declare @ID int
SET @ID=9
SELECT @ID=ID FROM #Person WHERE ID=1
print @ID
我希望屏幕上不会打印任何内容。为什么9印在屏幕上?
@ID最初用'9'初始化,但是它应该改为什么?
更新
我有一个.NET背景。请参阅以下代码:
Public Shared Sub Test()
Dim objCon As New SqlConnection(ConfigurationManager.ConnectionStrings("Connection").ConnectionString)
Dim objCmd As New SqlCommand
Dim testInt As Integer = 9
Using objCon
objCon.Open()
If objCon.State = ConnectionState.Open Then
objCmd.Connection = objCon
objCmd.CommandText = "SELECT ID FROM Person where ID=1"
testInt = CInt(objCmd.ExecuteScalar)
End If
End Using
End Sub
testInt初始化为0,因为命令对象(CInt(objCmd.ExecuteScalar))没有返回任何内容。为什么TSQL与.NET不一致?
我意识到这可能是一个直截了当的原因。但是,我从未发现过这个原因。
答案 0 :(得分:3)
WHERE
过滤掉所有行,因此SELECT
中的分配永远不会运行。因此,@ID
保持其初始值。
这很容易通过将值默认为NULL
来修复。但是,如果要确保在语句中将值设置为NULL
,则需要返回(至少)一行。聚合可以保证:
select @id = max(id)
from #Person
where id = 1;
答案 1 :(得分:3)
考虑一下:
declare @ID int
SET @ID=9
IF EXISTS(SELECT 1 FROM #Person WHERE ID=1)
SELECT @ID=ID FROM #Person WHERE ID=1
ELSE
SET @ID = 0
print @ID