Fra*_*ani 2 sql-server temporary-tables
我有这个查询来迭代我的 SQL Server 上的所有数据库
DECLARE @DB_Name varchar(100)
DECLARE @Command nvarchar(200)
DECLARE database_cursor CURSOR FOR
SELECT name
FROM MASTER.sys.sysdatabases
where name not in ('master','tempdb','model','msdb')
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @DB_Name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Command = 'SELECT ' + '''' + @DB_Name + '''' + 'as DB_name, SF.filename, SF.size FROM sys.sysfiles SF'
EXEC sp_executesql @Command
FETCH NEXT FROM database_cursor INTO @DB_Name
END
CLOSE database_cursor
DEALLOCATE database_cursor
Run Code Online (Sandbox Code Playgroud)
但是如何将结果全部存储在一张临时表中?
Dan Guzman 是对的(在他删除的评论中)你可以直接使用master.sys.master_files,你当然应该避免像这样的旧观点sysdatabases和sysfiles,但如果你需要做的使用数据类似的事情并不方便地卷成高手的你,你可以这样做:
DECLARE @db sysname, @sql nvarchar(max), @exec nvarchar(max);
DECLARE c CURSOR LOCAL FAST_FORWARD
FOR SELECT name FROM sys.databases
WHERE database_id > 4
AND state = 0;
OPEN c;
CREATE TABLE #files(db sysname, fn nvarchar(1000), sz int);
SET @sql = N'INSERT #files(db,fn,sz)
SELECT @db, physical_name, size
FROM sys.database_files;';
FETCH NEXT FROM c INTO @db;
WHILE @@FETCH_STATUS <> -1
BEGIN
SET @exec = QUOTENAME(@db) + N'.sys.sp_executesql';
EXEC @exec @sql, N'@db sysname', @db;
FETCH NEXT FROM c INTO @db;
END
CLOSE c; DEALLOCATE c;
SELECT db, fn, sz FROM #files;
DROP TABLE #files;
Run Code Online (Sandbox Code Playgroud)
注意没有笨重的字符串连接,没有混淆 16 个连续的单引号,如果一个数据库被命名,你的代码会发生什么oh'crap?正是出于这个原因,我保留了这样的数据库:
消息 105,级别 15,状态 1,第 1 行
字符串 'as DB_name, SF.filename, SF.size FROM sys.sysfiles SF' 后的未闭合引号。
但是,您可以更改您现在拥有的脚本来执行此操作:
INSERT #temptable(columns) EXEC sys.sp_executesql @Command;
Run Code Online (Sandbox Code Playgroud)
你可能也对我写的程序感兴趣sp_foreachdb,因为肯定有人会建议你使用sp_MSForEachDB,该过程没有记录,不受支持,并且严重损坏。
它也是 Brent Ozar 的First Responder Kit 的一部分。
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |