考虑以下代码:
DECLARE @db sysname;
DECLARE @filename varchar(260);
DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT d.name
FROM sys.databases d;
OPEN cur;
FETCH NEXT FROM cur INTO @db
WHILE @@FETCH_STATUS = 0
BEGIN
SET @filename = 'C:\temp\create_database_' + @db + '.txt';
:setvar c @filename
:out $(c)
PRINT $(c);
FETCH NEXT FROM cur INTO @db
END
CLOSE cur;
DEALLOCATE cur;
Run Code Online (Sandbox Code Playgroud)
我希望在 中创建多个文件C:\temp
,每个数据库一个,但没有创建任何文件,并且 SQL Server 没有报告任何错误。
我试过使用 SQLCMD 模式在 SSMS 中运行它,我也试过从 sqlcmd.exe 运行它
使用 sqlcmd 模式执行此操作的方法是编写一个脚本,该脚本编写一个脚本,然后执行这些脚本,因此这是一种略有不同的思考方式,有点像 Inception 或 Borges,梦中之梦:
-- Script a script which scripts a script
SET NOCOUNT ON
GO
:out d:\temp\temp.sql
GO
SELECT REPLACE( ':out d:\temp\@database.sql
-- Do some work here
PRINT ''select ''''@database''''''
GO
-- Return stdout to normal
:out STDOUT
GO
', '@database', name ) AS [--sql]
--C:\temp\create_database_' + name + '.txt'
FROM sys.databases
GO
-- Return stdout to normal
:out STDOUT
GO
-- Now execute your scripted file
:r d:\temp\temp.sql
GO
-- Create another script which executes all thoses scripts ...
:out d:\temp\temp2.sql
GO
SELECT REPLACE( ':r d:\temp\@database.sql
GO
', '@database', name ) AS [--sql]
FROM sys.databases
GO
-- Return stdout to normal
:out STDOUT
GO
-- Execute your script of scripts?
:r d:\temp\temp2.sql
GO
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3306 次 |
最近记录: |