簡體   English   中英

如何使用動態 SQL 查詢從存儲過程中獲取返回值

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

問題是顯示數據庫中具有超過 10 行和列的所有表名。

我有一個 cursor 成功返回超過 10 列的表名,但是當我嘗試通過將表名作為變量傳遞來計算特定表的所有行時,我收到一個錯誤,例如不能將 object 作為變量傳遞,因此試圖獲取使用動態 SQL 的存儲過程返回值(所有行數)。

我想從存儲過程中獲得所有行數的返回結果,因此我可以將它傳遞給另一個變量到 cursor。

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 

無論如何,您實際上並不需要 cursor,您可以生成 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM