考虑以下存储过程:
create procedure [dbo].[MyTest] ( @p_SqlStatement nvarchar(max) )
as
begin
exec sp_executesql @p_SqlStatement
if @@ROWCOUNT = 1
begin
select 1;
end
else if @@ROWCOUNT <> 1
begin
select 0;
end
end
此存储过程当前返回 2 个数据集,其中一个带有 exec sp_executesql @p_SqlStatement
数据,另一个可能是 1 或 0。有没有办法抑制第一个数据集?我的意思是,这个存储过程有可能只返回 1 或 0 吗?
我尝试添加 RAISERROR( 'MyError', 18, 1 )
就在exec sp_executesql @p_SqlStatement
之后然后在 catch block 中选择其他内容,但第一个结果集始终返回给我的存储过程调用者...
最佳答案
您可以将查询嵌入到 ifexists(
中。
alter procedure [dbo].[MyTest] ( @p_SqlStatement nvarchar(max) )
as
begin
set @p_SqlStatement = 'if exists('+@p_SqlStatement+') select 1 else select 0'
exec sp_executesql @p_SqlStatement
end
但是,有些查询无法实现。
- 多个语句
- 查询以
;
终止 - 使用 CTE's 的查询
可能还有更多,但这些是我现在能想到的。
更新:
您可以尝试使用openrowset .
alter procedure [dbo].[MyTest] ( @p_SqlStatement nvarchar(max) )
as
begin
declare @S nvarchar(max)
set @S =
'if exists(
select *
from openrowset(
''SQLNCLI'',
''Server=localhost;Trusted_Connection=yes;'',
'+quotename(@p_SqlStatement, '''')+'
) as T
)
select 1
else
select 0'
exec (@S)
end
我从未在生产中使用过它,但从我所做的测试来看,我看起来它应该适用于 SP、CTE 和多条线路。
您必须允许 ad hoc distributed queries .
关于sql-server-2008 - 如何在存储过程中仅返回单个结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13240037/