如何判断存储在变量中的SQL是否会返回任何行

时间:2011-10-10 21:20:42

标签: sql sql-server dynamic-sql

如果我有一个SQL脚本存储在这样的变量中:

DECLARE @SQL VARCHAR(MAX) = 'SELECT * FROM Employees WHERE Age > 80'

如果我要运行它,我怎么知道@SQL是否会返回任何行?

实际上是这样的:

IF EXISTS(@SQL) print 'yes, there are rows' -- Dummy code -- does not work!

我想尝试这个,而不必在@SQL中运行脚本,将其插入表中并计算行数。

3 个答案:

答案 0 :(得分:9)

当然你需要运行脚本。为了避免必须将结果插入表中并计算行,您可以使用sp_executesql和输出参数。

DECLARE @Statement NVARCHAR(MAX) = 'SELECT * FROM Employees WHERE Age > 80'

DECLARE @DynSQL NVARCHAR(max) = N'SET @Exists = CASE WHEN EXISTS(' + 
                                @Statement + 
                                N') THEN 1 ELSE 0 END'

DECLARE @Exists bit
EXEC sp_executesql @DynSQL,
                   N'@Exists bit OUTPUT',
                   @Exists = @Exists OUTPUT

SELECT @Exists AS [Exists]

答案 1 :(得分:2)

虽然Martin的回答也有效但我们不能在执行脚本后使用@@ RowCount吗?像

DECLARE @q nvarchar(max);
SET @q = 'declare @b int; select * from sys.tables where @b = 5';

EXEC (@q);

If @@RowCount > 0
    Print 'Rows > 0';
Else
    Print 'Rows = 0';

请注意,查询中包含变量声明,显然不能与存在()

一起使用

答案 2 :(得分:0)

您可以尝试开箱即用的解决方案。

例如。跟踪名为emp_over_80的单个变量。每当您添加超过该年龄的员工时,emp_over_80 ++。当你删除一个,emp_over_80--

在每天开始时,运行查询以确定emp_over_80的值(可能是员工的生日)。然后,在一天中,您可以引用emp_over_80而不是重新运行SQL查询。

其他选项是保持员工表按年龄排序。如果最后一名员工超过80,那么您的查询将返回至少一行。

现在,很多人可能会说这些是可怕的编码习惯,我同意他们的看法。但是,在运行之前,我没有看到另一种神奇地知道查询结果(甚至是部分结果)的方法。