如何使用动态 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;
问题是显示数据库中超过 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;