sql-server-2008 - 如何在存储过程中仅返回单个结果集

标签 sql-server-2008 t-sql

考虑以下存储过程:

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/

相关文章:

t-sql - 如何管理实体属性上的 Encrypt* 和 Decrypt* TSQL 函数?

sql - 加速一张表上的哈希匹配运算符

sql-server - WHERE IN (SELECT NonExistingColumnName) 导致意外行为

c# - 成功删除记录时 ExecuteNonQuery 返回值 0

t-sql - UNION ALL 可以比 JOIN 更快吗?还是我的 JOIN 很糟糕?

sql-server - 将Csv字符串转换为表格并获取位置

sql-server-2008 - Coldfusion CFSTOREDPROC 不返回表

sql - 为什么 sql 将数字转换为 '*' 字符

sql - 列值转换

sql - T-SQL 查找带有单独换行符的字符串(缺少回车符)