遍历所有表

时间:2018-08-29 08:37:03

标签: sql sql-server tsql

我正在寻找一种遍历数据库中所有表的方法。

到目前为止,我已经提出了这个建议:

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>

2 个答案:

答案 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)