【问题标题】:Using sp_executesql without returning row sets使用 sp_executesql 而不返回行集
【发布时间】:2013-11-21 16:08:33
【问题描述】:

在存储过程中,我正在构建使用sp_executesql 过程执行的动态 SQL 语句。

动态 SQL 语句可以是存储过程,即:

  • 不返回行集
  • 确实返回一行集
  • 确实返回多个行集

初始存储过程本身返回其他行集。我只想返回它们,而不是从内部过程返回行集。

一般情况下,我想强制以下语句不返回任何内容:

DECLARE @DynamicSQLStatement NVARCHAR(MAX)

SET @DynamicSQLStatement = N'SELECT 1 SELECT 2 SELECT 3 SELECT 4 SELECT 5'

EXEC sp_executesql @DynamicSQLStatement

有没有办法做到这一点?

【问题讨论】:

  • 如果您必须使用动态 SQL 并且它返回一个、无或多个结果集,并为您提供预期的结果集,为什么要更改它?????
  • 因为Dynamic SQL 应该做类似INSERT 记录的事情,但我不需要像All records are insertedList with inserted records 那样显示其内部消息
  • 哦,如果只是为了抑制 n row(s) affected 消息,那么 SET NOCOUNT ON 是你的朋友。
  • 不,不是这条消息。想象一个在表中插入一些记录并返回两个行集的过程 - 一个状态为“OK”/“Not ok”,第二个列出所有插入的行。我不想显示此信息,因为初始过程正在返回自己的行集。

标签: sql sql-server stored-procedures sql-server-2012


【解决方案1】:

我猜你可以通过做这样的事情来调整你的存储过程。

CREATE PROCEDURE usp_StopMessageProc
@StopMsg bit = 0
AS
BEGIN
 SET NOCOUNT ON;

    DECLARE @Sql VARCHAR(MAX);

    SET @Sql = '';

    SET @Sql = 'SELECT Column1, Column2, Column3....  ';

    IF @StopMsg = 1
         SET @Sql = @Sql + 'INTO #TempDeleteMe';

    SET @Sql = @Sql +     
    'FROM dbo.SomeTable ';

    EXEC(@Sql);
END
GO

默认情况下,您的 proc 将尽其所能,但当 @StopMsg 设置为 1 时,它会抑制返回消息/结果集。

【讨论】:

  • 如果存储过程返回多个行集,这应该工作吗?
  • 好吧,如果 @StopMsg = 1 并且 proc 可以返回多个结果集,那么您必须进入 Proc 定义并对多个结果集执行上述操作,只要您的 proc 中有 Select 语句,只需 SELECT * INTO #Temp 表,永远不要在你的过程中调用 Temp 表。
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 2013-01-27
  • 2019-12-25
  • 2021-10-23
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多