lar*_*ryq 17 t-sql sql-server aggregate variable-assignment
我对这个陈述有些麻烦,毫无疑问我对这个选择陈述的回复是无知的:
declare @myInt as INT
set @myInt = (select COUNT(*) from myTable as count)
if(@myInt <> 0)
begin
print 'there's something in the table'
end
Run Code Online (Sandbox Code Playgroud)
myTable中有记录,但是当我运行上面的代码时,print语句永远不会运行.进一步检查表明,在上面的赋值后,myInt实际上为零.我确定我错过了一些东西,但我认为选择计数会返回一个我可以在上面使用的标量?
gbn*_*gbn 37
如果@myInt为零,则表示表中没有行:如果从未设置,则为NULL.
COUNT将始终返回一行,即使表中没有行也是如此.
编辑,2012年4月:这里的规则在我的答案中描述:COUNT(*)总是返回结果吗?
您的计数/分配是正确的,但可以是任何一种方式:
select @myInt = COUNT(*) from myTable
set @myInt = (select COUNT(*) from myTable)
Run Code Online (Sandbox Code Playgroud)
但是,如果您只是寻找行的存在,(NOT)EXISTS更有效:
IF NOT EXISTS (SELECT * FROM myTable)
Run Code Online (Sandbox Code Playgroud)
Declare @MyInt int
Set @MyInt = ( Select Count(*) From MyTable )
If @MyInt > 0
Begin
Print 'There''s something in the table'
End
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是您的问题,但您必须使用第二个单引号来解决print语句中的单引号.虽然您可以使用SELECT来填充变量,但是使用SET就像您在这里所做的那样只是更好和更清晰的IMO.此外,您可以保证Count(*)永远不会返回负值,因此您只需检查它是否大于零.