【问题标题】:How to get return value from stored procedure with dynamic SQL query如何使用动态 SQL 查询从存储过程中获取返回值
【发布时间】:2022-01-06 01:24:29
【问题描述】:

问题是显示数据库中所有超过 10 行和列的表名。

我有一个游标成功返回超过 10 列的表名,但是当我尝试通过将表名作为变量传递来计算特定表的所有行时,我收到一个错误,例如无法将对象作为变量传递尝试使用带有动态 SQL 的存储过程获取返回值(所有行数)。

我想从存储过程中获得所有行数的返回结果 我可以将它传递给游标中的另一个变量。

DECLARE @TABLENAME VARCHAR(50) 
DECLARE @COUNTROW INT
DECLARE @COLUMNCOUNT INT
DECLARE @ROWCOUNT INT

DECLARE TABLECURSOR CURSOR SCROLL FOR 
    SELECT NAME FROM SYS.TABLES 

OPEN TABLECURSOR 
FETCH NEXT FROM TABLECURSOR INTO @TABLENAME 

WHILE @@FETCH_STATUS = 0
BEGIN
    --EXEC @COUNTROW = USP_XX_EXECUTESQL @TABLENAME     --[ CALL SP AND RETURN RESULT TO @COUNTROW ] 
        
    SELECT @COLUMNCOUNT = COUNT(*) 
    FROM INFORMATION_SCHEMA.Columns 
    WHERE TABLE_NAME = @TABLENAME 
        
    IF (@COLUMNCOUNT > 10)
    BEGIN
        PRINT @TABLENAME
    END

    FETCH NEXT FROM TABLECURSOR INTO @TABLENAME 
END

CLOSE TABLECURSOR
DEALLOCATE TABLECURSOR


----STORED PROCEDURE TO COUNT ROWS 

CREATE PROCEDURE USP_XX_EXECUTESQL(@TABLE VARCHAR(MAX))
AS
BEGIN
    EXEC('SELECT COUNT(*) FROM ' + @TABLE)     -- How to return value from here 
END

【问题讨论】:

  • docs.microsoft.com/en-us/sql/relational-databases/… 了解存储过程和参数,您的过程需要一些东西来返回给调用者。作为动态它需要一个输出参数。对于动态 SQL 及其困难,请阅读sommarskog.se/dynamic_sql.html
  • 是时候开始认真思考你编写的代码了。表名不能包含 2 GB 的字符。为此使用 sysname 数据类型。您的过程还返回一个结果集 - 使用它的代码检索返回值。这是避免重新发明轮子的另一个原因。对“计算所有表中的行数”进行简单搜索会发现许多示例,您可以根据自己的目的进行调整。
  • @KnutBoehnert 谢谢你的帮助

标签: sql sql-server stored-procedures database-cursor


【解决方案1】:

无论如何,您实际上并不需要光标,您可以生成 SQL 并一次性动态执行它。

但无论如何,最好只查询系统视图的行数

SELECT
  SchemaName = SCHEMA_NAME(t.schema_id),
  TableName = t.name,
  TotalRowCount = (
      SELECT SUM(p.rows)
      FROM sys.partitions p
      WHERE t.object_id = p.object_id
        AND p.index_id IN ( 0, 1 )  -- heap or clustered
  ),
  TotalColumns = (
      SELECT COUNT(*)
      FROM sys.columns c
      WHERE t.object_id = c.object_id
  )
FROM sys.tables t;

【讨论】:

  • 非常感谢您的完美回答
【解决方案2】:

这里是答案

   DECLARE @sql    nvarchar(MAX)
    DECLARE @TABLE NVARCHAR(30)
    DECLARE  @params nvarchar(4000)
         
    SET @TABLE = N'AGENT'
    SELECT @sql = N'SELECT @cnt = COUNT(*) 
                    FROM  ' + @TABLE 
    
       SELECT @params = N'   @cnt int OUTPUT'
                     
                   
    
    DECLARE @cnt  int`enter code here`
    EXEC sp_executesql  @sql,  @cnt OUTPUT
    SELECT @cnt  AS TOTALROW 

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多