【问题标题】:Return value from exec(@sql)来自 exec(@sql) 的返回值
【发布时间】:2011-05-07 00:56:04
【问题描述】:

我想从Exec(@sql) 获取值并分配给@Rowcount(int)

这是我的查询:

'SET @RowCount = (select count(*) 
                    FROM dbo.Comm_Services 
                   WHERE CompanyId = '+cast(@CompanyId as char)+' and '+@condition+')'

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案1】:
    DECLARE @nReturn int = 0
    EXEC @nReturn = Stored Procedure
    

    【讨论】:

    • 这适用于检索存储过程的返回值,但不适用于动态 SQL。
    【解决方案2】:

    今天在玩这个...我相信你也可以使用@@ROWCOUNT,像这样:

    DECLARE @SQL VARCHAR(50)
    DECLARE @Rowcount INT
    SET @SQL = 'SELECT 1 UNION SELECT 2'
    EXEC(@SQL)
    SET @Rowcount = @@ROWCOUNT
    SELECT @Rowcount
    

    然后将SELECT 1 UNION SELECT 2 替换为您的实际选择,而不需要计数。我建议只在您的选择中添加 1,如下所示:

    SELECT 1
    FROM dbo.Comm_Services
    WHERE....
    ....
    

    (而不是放 SELECT *)

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      一方面你可以使用 sp_executesql:

      exec sp_executesql N'select @rowcount=count(*) from anytable', 
                          N'@rowcount int output', @rowcount output;
      

      另一方面,您可以使用临时表:

      declare @result table ([rowcount] int);
      insert into @result ([rowcount])
      exec (N'select count(*) from anytable');
      declare @rowcount int = (select top (1) [rowcount] from @result);
      

      【讨论】:

      • 非常好!除了在 SQL 2016 中,这会给出“关键字 'rowcount' 附近的语法不正确”。似乎 ROWCOUNT 是一个保留标识符。搜索并将 rowcount 替换为 row_count 效果很好。谢谢。
      • 非常好。但是,不要忘记在最后删除表格。
      • @Zamir @result 是表变量,不是临时表,所以不需要删除。事实上,你不能删除它,类似于你不能删除任何其他变量,例如整数。
      • 非常感谢 cmets。重命名是一个选项,放入括号是我在编辑的答案中选择的另一个选项。是的,你不能删除表变量——它们只存在于变量的范围内。
      【解决方案4】:

      这是我的程序

      CREATE PROC sp_count
          @CompanyId sysname,
          @codition sysname
          AS
          SET NOCOUNT ON
          CREATE TABLE #ctr
          ( NumRows int )
      
          DECLARE @intCount int
               , @vcSQL varchar(255)
      
          SELECT    @vcSQL = ' INSERT #ctr FROM dbo.Comm_Services 
                             WHERE CompanyId = '+@CompanyId+' and '+@condition+')'
          EXEC      (@vcSQL)
      
          IF @@ERROR = 0
          BEGIN
               SELECT    @intCount = NumRows
               FROM #ctr
      
               DROP TABLE #ctr
               RETURN @intCount
          END
          ELSE
          BEGIN
               DROP TABLE #ctr
               RETURN -1
          END
          GO
      

      【讨论】:

        【解决方案5】:

        如果我理解正确,(我可能没有)

        'SELECT @RowCount = COUNT(*)
                           FROM dbo.Comm_Services
                           WHERE CompanyId = ' + CAST(@CompanyId AS CHAR) + '
                           AND ' + @condition
        

        【讨论】:

        • 变量将超出对EXEC('...')的调用范围。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多