[英]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.