Sql 选择空值时不初始化值

Sql 选择空值时不初始化值,sql,sql-server,tsql,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 Public Shared Sub Test() Dim objCon As New SqlConnection(ConfigurationManager.ConnectionStrings("Connection").ConnectionString)

请参阅下面的代码:

create table #Person (id int)
declare @ID int
SET @ID=9
SELECT @ID=ID FROM #Person WHERE ID=1
print @ID
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
我希望屏幕上不会打印任何内容。为什么9会打印到屏幕上

@ID最初是用“9”初始化的,但后来应该改为“无”

更新

我有.NET背景。请参阅下面的代码:

create table #Person (id int)
declare @ID int
SET @ID=9
SELECT @ID=ID FROM #Person WHERE ID=1
print @ID
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初始化,因为命令对象CIntobjCmd.ExecuteScalar不返回任何内容。为什么TSQL与.NET不一致

我意识到这可能有一个直接的原因。但是,我从未发现这个原因。

WHERE会过滤掉所有行,因此SELECT中的赋值永远不会运行。因此,@ID保留其初始值

这很容易通过将值默认为NULL来修复。但是,如果要确保语句中的值设置为NULL,则需要至少返回一行。聚合保证:

select @id = max(id)
from #Person
where id = 1;
考虑这一点:

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

因为没有匹配项,所以SELECT中的分配永远不会运行。因为@ID没有设置为任何值,因为您的查询中没有结果。谢谢+1用于解决方法。我已经更新了这个问题,我希望它能帮助回答者理解我为什么问这么简单的问题。你能看一下吗?@w0051977。select语句与赋值不同。你可以把select看作是一个循环。如果未选择任何行,则没有分配。好的,谢谢+请看我的评论。如果将来有人对这个问题感兴趣,那么在答案中添加评论可能是值得的。谢谢+1用于解决方法。我已经更新了这个问题,我希望它能帮助回答者理解我为什么问这么简单的问题。你能看一下吗?