如果我有一个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中运行脚本,将其插入表中并计算行数。
答案 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,那么您的查询将返回至少一行。
现在,很多人可能会说这些是可怕的编码习惯,我同意他们的看法。但是,在运行之前,我没有看到另一种神奇地知道查询结果(甚至是部分结果)的方法。