Sql server 2008 SQL Server:您能帮我完成这个查询吗?
我想在SQL Server 2008数据库服务器上运行诊断报告 我将遍历所有数据库,然后针对每个数据库,我希望查看每个表。但是,当我用tbl_游标查看每个表时,它总是会选择数据库“master”中的表 我想这是因为我选择了tbl_光标:Sql server 2008 SQL Server:您能帮我完成这个查询吗?,sql-server-2008,information-schema,Sql Server 2008,Information Schema,我想在SQL Server 2008数据库服务器上运行诊断报告 我将遍历所有数据库,然后针对每个数据库,我希望查看每个表。但是,当我用tbl_游标查看每个表时,它总是会选择数据库“master”中的表 我想这是因为我选择了tbl_光标: SELECT table_name FROM information_schema.tables WHERE table_type = 'base table' 我该如何解决这个问题 以下是完整的代码: SET NOCOUNT ON DECLARE
SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'
我该如何解决这个问题
以下是完整的代码:
SET NOCOUNT ON
DECLARE @table_count INT
DECLARE @db_cursor VARCHAR(100)
DECLARE database_cursor CURSOR FOR
SELECT name FROM sys.databases where name<>N'master'
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @db_cursor
WHILE @@Fetch_status = 0
BEGIN
PRINT @db_cursor
SET @table_count = 0
DECLARE @table_cursor VARCHAR(100)
DECLARE tbl_cursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'
OPEN tbl_cursor
FETCH NEXT FROM tbl_cursor INTO @table_cursor
WHILE @@Fetch_status = 0
BEGIN
DECLARE @table_cmd NVARCHAR(255)
SET @table_cmd = N'IF NOT EXISTS( SELECT TOP(1) * FROM ' + @table_cursor + ') PRINT N'' Table ''''' + @table_cursor + ''''' is empty'' '
--PRINT @table_cmd --debug
EXEC sp_executesql @table_cmd
SET @table_count = @table_count + 1
FETCH NEXT FROM tbl_cursor INTO @table_cursor
END
CLOSE tbl_cursor
DEALLOCATE tbl_cursor
PRINT @db_cursor + N' Total Tables : ' + CAST( @table_count as varchar(2) )
PRINT N'' -- print another blank line
SET @table_count = 0
FETCH NEXT FROM database_cursor INTO @db_cursor
END
CLOSE database_cursor
DEALLOCATE database_cursor
SET NOCOUNT OFF
使用表变量更容易,因此可以使用另一个动态SQL语句将行添加到@tablist
SET NOCOUNT ON
DECLARE @table_count INT
DECLARE @dblist TABLE (DBName VARCHAR(100))
DECLARE @tablist TABLE (TableName VARCHAR(100))
DECLARE @dbname varchar(100), @tabname varchar(100)
INSERT @dblist
SELECT name FROM sys.databases where name<>N'master'
SELECT TOP 1 @dbname = DBName FROM @dblist
WHILE @@ROWCOUNT <> 0
BEGIN
INSERT @tablist (tableName)
EXEC ('SELECT table_name FROM ' + @dbname + '.information_schema.tables WHERE table_type = ''base table'' ')
SELECT TOP 1 @tabname = tableName FROM @tablist
WHILE @@ROWCOUNT <> 0
BEGIN
--do my stuff
DELETE @tablist WHERE tableName = @tabname
SELECT TOP 1 @tabname = tableName FROM @tablist
END
DELETE @dblist WHERE DBName = @dbname
SELECT TOP 1 @dbname = DBName FROM @dblist
END
使用表变量更容易,因此可以使用另一个动态SQL语句将行添加到@tablist
SET NOCOUNT ON
DECLARE @table_count INT
DECLARE @dblist TABLE (DBName VARCHAR(100))
DECLARE @tablist TABLE (TableName VARCHAR(100))
DECLARE @dbname varchar(100), @tabname varchar(100)
INSERT @dblist
SELECT name FROM sys.databases where name<>N'master'
SELECT TOP 1 @dbname = DBName FROM @dblist
WHILE @@ROWCOUNT <> 0
BEGIN
INSERT @tablist (tableName)
EXEC ('SELECT table_name FROM ' + @dbname + '.information_schema.tables WHERE table_type = ''base table'' ')
SELECT TOP 1 @tabname = tableName FROM @tablist
WHILE @@ROWCOUNT <> 0
BEGIN
--do my stuff
DELETE @tablist WHERE tableName = @tabname
SELECT TOP 1 @tabname = tableName FROM @tablist
END
DELETE @dblist WHERE DBName = @dbname
SELECT TOP 1 @dbname = DBName FROM @dblist
END
问题是因为您实际上总是在master db上下文下运行INFORMATION_SCHEMA.TABLES查询 您需要将tbl_游标块转换为动态SQL,以便使用DB名称完全限定查询 e、 g
基本上就是您需要为该游标执行的操作。问题在于您实际上总是在master db上下文下运行INFORMATION\u SCHEMA.TABLES查询 您需要将tbl_游标块转换为动态SQL,以便使用DB名称完全限定查询 e、 g
基本上就是您需要为该游标执行的操作。您可能需要创建动态SQL。因为information_schema将仅从当前活动数据库中获取对象,您正在对其运行此查询
您可以尝试sys.objects您可能需要创建动态SQL。因为information_schema将仅从当前活动数据库中获取对象,您正在对其运行此查询
你可以试试sys.objects@rib:没有mssql这样的东西。该产品称为SQL Server。MS SQL很容易与MySQL混淆。@rib:没有MS SQL这样的东西。该产品称为SQL Server。MS SQL很容易与MySQL混淆。