如何使用动态 SQL 查询从存储过程中获取 return 值

How to get return value from stored procedure with dynamic SQL query

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

我有一个游标,它成功地 returning table 超过 10 列的名称,但是当我尝试通过传递 table name as variable,我得到一个错误,比如不能将对象作为变量传递,因此尝试使用动态 SQL.

的存储过程来获取 return 值(所有行数)

我想得到 return 结果,因为存储过程中的所有行数因此 我可以将它传递给另一个变量到游标中。

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

这是答案

   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 

无论如何你真的不需要光标,你可以生成 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;