如何从 SQL Server Management Studio 中执行一组 .SQL 文件(每个文件都进行一些数据转换)?
还有什么其他方法可以批量执行 .SQL 文件?
虽然 SQLCMD.exe 是最好的方法,但 SSMS 还具有 SQLCMD 模式,您可以在其中执行 SQLCMD 脚本。要启用此模式,请单击菜单栏中的查询,然后选择SQLCMD模式。
“:r filename.sql”命令是SQLCMD脚本命令,用于导入并执行sql脚本文件。您知道您处于 SQLCMD 模式,因为 SQLCMD 脚本命令的任何行都会以彩色(我认为是灰色)背景显示。
:setvar path "c:\Path_to_scripts\"
:r $(path)\file1.sql
:r $(path)\file2.sql
使用SqlCmd.exe。
对于示例:
sqlcmd -S myServer\instanceName -i C:\myScript.sql
或将输出保存到文件中:
sqlcmd -S myServer\instanceName -i C:\myScript.sql -o C:\EmpAdds.txt
您可以在不使用 SQLCMD 模式或在 SSMS 之外使用 SQLCMD 的情况下执行 T-SQL 文件,如下所示:
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'' >> c:\SQLscript.sql',no_output --test script
set @sqlfile = 'c:\SQLscript.sql' --script location
set @sqlcmd = 'sqlcmd -E -i '+@sqlfile
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;
这是波塞冬答案的附录:
您可能有理由保留“xp_cmdshell”的状态,甚至“显示高级选项”配置设置,这样,如果它们事先打开或关闭,它们会在之后切换(而不是总是关闭它们)。这是我编写的一对(过度设计的)块,它们将保留两个块的状态作为临时表,然后如果它们存在,它将在之后将设置设置回来。这样做的优点是不受 GO 影响,因此它将在整个会话和多个批次中持续存在。不过,这些是本地临时表,因此必须是检查 AFTER 块的同一会话。您可以用它作为书挡包装您的脚本,也可以只运行 before 块,执行您需要执行的操作(在同一窗口或另一个窗口中,设置是服务器范围的),然后在同一会话中运行 before 块关闭。
-- BEFORE
IF (SELECT TOP 1 CAST([value] AS INT) FROM sys.configurations WHERE [name] = 'xp_cmdshell') <> 1
-- xp_cmdshell is configured off, need to reconfigure to run
BEGIN
IF(OBJECT_ID('tempdb.dbo.#xp_cmdshell_disabled') IS NOT NULL)
DROP TABLE #xp_cmdshell_disabled
CREATE TABLE #xp_cmdshell_disabled (placeholder bit)
IF (SELECT TOP 1 CAST([value] AS int) FROM sys.configurations WHERE [name] = 'Show Advanced Options') <> 1
-- advanced options is off, must be reconfigured in order to enable xp_cmdshell
BEGIN
IF(OBJECT_ID('tempdb.dbo.#advanced_options_disabled') IS NOT NULL)
DROP TABLE #advanced_options_disabled
CREATE TABLE #advanced_options_disabled (placeholder bit)
EXEC sp_configure 'Show Advanced Options', 1
RECONFIGURE
END
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
END
-- AFTER
BEGIN
IF(OBJECT_ID('tempdb.dbo.#xp_cmdshell_disabled') IS NOT NULL)
-- xp_cmdshell was previously off, let's turn it back off per site configuration.
BEGIN
EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE
IF(OBJECT_ID('tempdb.dbo.#xp_cmdshell_disabled') IS NOT NULL)
DROP TABLE #xp_cmdshell_disabled
IF(OBJECT_ID('tempdb.dbo.#advanced_options_disabled') IS NOT NULL)
BEGIN
EXEC sp_configure 'Show Advanced Options', 0
RECONFIGURE
IF(OBJECT_ID('tempdb.dbo.#advanced_options_disabled') IS NOT NULL)
DROP TABLE #advanced_options_disabled
END
END
END