连接多个服务器和数据库,并运行相同的SQL语句

18 浏览
0 Comments

连接多个服务器和数据库,并运行相同的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,但那似乎很凌乱。

0
0 Comments

问题原因:需要连接到多个服务器和数据库,并运行相同的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在服务器列表上循环,并对每个服务器执行查询会更加容易。

0
0 Comments

问题出现的原因是需要连接到多个服务器和数据库,并运行相同的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语句。

0