0

我有一个关于输出的愚蠢问题。我有一个存储过程,它内部正在执行动态 SQL 来检查表中是否有记录,这就是示例:

SET @sqlLog = 
    'SELECT 1 FROM MyTable 
      WHERE TableName = ''' + @TableName + '''' + '
        AND TheKey = ''' + convert(varchar(50), @LoadGuid) + ''''                                    
EXEC(@sqlLog)

之后,我使用 @@RowCount 来验证结果是否为 0。

问题是在 WHILE 内,并且每一行都在 SQL Management Studio 的输出窗口中显示结果,我真的不想要这个。任何的想法?谢谢!

4

5 回答 5

0

如果您只需要知道查询产生的行数,请尝试将选择列表更改为 only 'SELECT COUNT(*) FROM MyTable ... '。这将为您提供单个结果的计数。

于 2012-10-01T16:11:10.733 回答
0
declare @count int

exec sp_executeSql 
    N'set @count = (select count(*) from MyTable where TableName = ''' + @tableName + '''
    and TheKey =  ''' + convert(varchar(50), @LoadGuid) + '''',
    N'@count int output',
    @count = @count output

if @count > 0
    print 'rows exist'
else
    print 'no rows'
于 2012-10-01T16:11:11.530 回答
0

我认为您需要使用 NOCOUNT 选项:

SET NOCOUNT ON

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms189837.aspx

祝你好运,

戴夫·切尔卡斯基

于 2012-10-01T16:17:54.137 回答
0

为什么你甚至需要动态 SQL?,你可以做如下的事情:

IF EXISTS ( SELECT 1 FROM MyTable 
            WHERE TableName = @TableName 
            AND TheKey = convert(varchar(50), @LoadGuid))
BEGIN
    -- Your logic here
END
于 2012-10-01T16:21:19.110 回答
0

没有办法让它抑制像这样的直接选择语句的结果。您实际上是在告诉它将这些结果返回给调用应用程序,这里是 SSMS,它正在这样做。SSMS 正在正确显示这些结果。您有一些关于如何显示它们的选项(结果窗格或文本等),但我不知道 SSMS 中有一个选项可以将其关闭。

您可以做的是将sp_executesql与输出参数一起使用,这样您就无需请求任何结果,而只需将行数放入参数中即可。这看起来像:

declare @theCount int

SET @sqlLog =       'SELECT @theCount = count(*)  
  FROM MyTable         
  WHERE TableName = ''' + @TableName + '''' + 
  '          AND TheKey = ''' + convert(varchar(50), @LoadGuid) + ''''            

EXEC sp_executesql @sqlLog, N'@theCount int OUTPUT', @theCount=@theCount OUTPUT 

然后检查@theCount 的值是否为0 而不是@@Rowcount。

于 2012-10-01T16:40:50.980 回答