在 SQL Server 中将 SQL 文件嵌套到另一个文件中

Dom*_*que 3 sql-server t-sql external-scripts

我有一个简单的 SQL 文件,用于执行一些测试:

DECLARE @VAR1 AS VARCHAR(100) = '12345'
DECLARE @VAR2 AS INTEGER      = 54321

WAITFOR DELAY '00:00:02'

INSERT Orders SELECT @VAR1 AS COL1, @VAR2 AS COL2, ...
...
Run Code Online (Sandbox Code Playgroud)

在启动这一切之前,我想做一些清理工作:

/* Clean SpecialSubSubEntries */
DELETE SpecialSubSubEntries
  WHERE Id IN (SELECT Id FROM SubSubEntries
                 WHERE SubEntryId IN (SELECT Id FROM SubEntries
                                        WHERE EntryId IN (SELECT Id FROM Entries
                                                            WHERE Name='ENTRY01')
                                      )
               )

DELETE SubSubEntries
  WHERE SubEntryId IN (SELECT Id FROM SubEntries
                         WHERE EntryId IN (SELECT Id FROM Entries
                                             WHERE Name='ENTRY01')
                      )
...
Run Code Online (Sandbox Code Playgroud)

出于可读性原因,我想将所有清理命令放入文件“cleanup.sql”中,并在 SQL 文件的开头启动它。我该如何做这样的事情?

我想是这样的:

EXECUTE ".\cleanup.sql"
Run Code Online (Sandbox Code Playgroud)

...但我不确定语法。

Pos*_*don 5

您可以从 SSMS 中以 SQLCMD 模式执行脚本。请参阅此处的答案:How can I execute a set of .SQL files from inside SSMS?

为此,您需要将 SSMS 查询设置为 SQLCMD 模式,翻译该代码的是客户端工具,而不是数据库引擎。Query要启用此模式,请在 SSMS 中下拉菜单,然后选择SQLCMD Mode

我提供了一个纯粹的 T-SQL 解决方案,没有任何麻烦,它经过测试并且工作得非常顺利:

重要提示:除非您非常了解其背后的风险,否则不建议使用此方法。xp_cmdshell该脚本在执行后启用然后禁用,如 Microsoft此处建议的那样

如果必须使用 xp_cmdshell,作为安全最佳实践,建议仅在需要它的实际任务期间启用它。

exec sp_configure 'show advanced options',1;reconfigure with override;
exec sp_configure 'xp_cmdshell',1;reconfigure with override;

declare @sqlfile nvarchar(100),@sqlcmd varchar(4000)

exec xp_cmdshell 'del c:\SQLscript.sql && echo SELECT ''This Is a script running on SQLCMD from SSMS'' DataColumn >> c:\SQLscript.sql',no_output --test script

set @sqlfile = 'c:\SQLscript.sql' --script location
set @sqlcmd = 'sqlcmd -E -i '+@sqlfile 
/* the above string runs sqlcmd on the server which sqlcmd was invoked, and with trusted connection, 
if you need to run the script on a different server/instance, you'll need replace the "-E" with "-S" and specify servername/ip address and credentials with "-U" for username and "-P" for password*/

exec xp_cmdshell @sqlcmd --executing script

exec sp_configure 'xp_cmdshell',0;reconfigure with override;
exec sp_configure 'show advanced options',0;reconfigure with override;
Run Code Online (Sandbox Code Playgroud)