我正在寻找一种遍历数据库中所有表的方法。
到目前为止,我已经提出了这个建议:
DECLARE @TableName VARCHAR(MAX)
DECLARE MyCursor CURSOR
FOR
SELECT
DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG ='MyDB'
AND TABLE_SCHEMA=N'dbo'
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT *
FROM @TableName
FETCH NEXT FROM MyCursor INTO @TableName
END
CLOSE MyCursor
DEALLOCATE MyCursor
我在While语句The @TableName tablevariable must be declared
中得到了一条错误消息(翻译为德语)。
我知道在TABLE
处应该有一个FROM @TableName
类型的变量,但是我还没有找到如何做到这一点的方法,只是如何声明不需要的新表。 / p>
答案 0 :(得分:5)
您不能SELECT * FROM @TableName
您将需要使用动态SQL
declare @sql nvarchar(max)
SELECT @sql = 'SELECT * FROM ' + QUOTENAME(@TableName)
exec sp_executesql @sql
答案 1 :(得分:3)
要在所有表上执行select
,必须使用动态SQL,如其他答案所述。此外,您根本不需要光标! :)
尝试一下:
declare @sql varchar(max) = '';
select @sql = @sql + 'select * from ' + TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME + ' '
from information_schema.tables
exec(@sql)