连接多个服务器和数据库,并运行相同的SQL语句
连接多个服务器和数据库,并运行相同的SQL语句
我有一个固定的SQL Server 2019 (v15) Express数据库列表,分布在全国各地。我希望通过T-SQL批处理脚本来查询它们。已经启用了SQLCMD并运行了以下脚本:\n
DECLARE @tsql nvarchar(500) = 'SELECT value FROM DB.dbo.Tablename' :Connect EMS2410 GO EXECUTE sp_executesql @tsql :Connect EMS2411 GO EXECUTE sp_executesql @tsql
\n如果没有GO
,连接语句无法正常工作,而有了它,我就失去了我的变量。希望听听大家对这种情况的任何想法。我可以使用搜索和替换来插入实际的SQL,但那似乎很凌乱。
问题原因:需要连接到多个服务器和数据库,并运行相同的SQL语句。
解决方法:有几种方法可以解决这个问题。
方法一:创建一个单独的脚本文件,然后在每个部分中使用该脚本文件:
:connect servername :r {script file}
方法二:设置SQLCMD文件来构建脚本,然后每个部分执行该脚本,并在最后删除该脚本:
:out C:\Temp\TempScript.sql Set NoCount On; Declare @Script nvarchar(max) = ''; Set @Script = ' Set NoCount On; {build your script} '; Select @Script; Go
调用该脚本文件:
:setvar ScriptFile "C:\Temp\TempScript.sql" :connect servername :r '$(ScriptFile)' Go
然后删除临时脚本文件:
!!del '$(ScriptFile)'
另外,使用Powershell和Invoke-SqlCmd在服务器列表上循环,并对每个服务器执行查询会更加容易。
问题出现的原因是需要连接到多个服务器和数据库,并运行相同的SQL语句。解决方法是使用T-SQL脚本来生成并执行连接到多个服务器和数据库的SQL语句。
首先,需要创建一个名为ServerName的表,用于存储服务器名称。然后使用INSERT语句向表中插入服务器名称。
接下来,使用以下T-SQL脚本来生成需要执行的SQL语句。
declare @sql varchar(max) = '' declare @connectSql varchar(max) = '' ; with SvrNames as ( SELECT [SvrName] FROM [DBName].[dbo].[ServerName] ) select @connectSql = STRING_AGG(' :Connect ' + [SvrName] + ' GO ' + char(10) + char(13) + 'EXECUTE sp_executesql ' + char(10) + char(13), '') from SvrNames select @sql = ' DECLARE @query nvarchar(500) = ''SELECT value FROM DB.dbo.Tablename''' + --select EXECUTE (@sql)
以上脚本将生成并执行以下SQL语句。
DECLARE @query nvarchar(500) = 'SELECT value FROM DB.dbo.Tablename' :Connect Server1 GO EXECUTE sp_executesql :Connect Server2 GO EXECUTE sp_executesql :Connect Server3 GO EXECUTE sp_executesql :Connect Server4 GO EXECUTE sp_executesql :Connect Server5 GO EXECUTE sp_executesql
通过以上方法,可以连接到多个服务器和数据库,并运行相同的SQL语句。