选择SELECT时不初始化值

时间:2016-01-04 21:46:37

标签: sql sql-server tsql

请参阅以下代码:

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不一致?

我意识到这可能是一个直截了当的原因。但是,我从未发现过这个原因。

2 个答案:

答案 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