【发布时间】: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