首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接到多个服务器和数据库并运行相同的SQL语句

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

Stack Overflow用户
提问于 2021-07-24 00:27:36
回答 2查看 119关注 0票数 0

我有一个固定的SQL Server 2019 (v15) Express数据库列表,分布在全国各地。我希望编写一种在T-SQL批处理中查询它们的方法。已经到了启用SQLCMD并运行这个的地步。

代码语言:javascript
运行
复制
DECLARE @tsql nvarchar(500) = 'SELECT value FROM DB.dbo.Tablename'
    
:Connect EMS2410
GO

EXECUTE sp_executesql @tsql

:Connect    EMS2411
GO

EXECUTE sp_executesql @tsql

如果没有GO,connect语句就不能工作,有了它我的变量就会丢失。寻找人们在这种情况下可能有的任何想法。我可以做一个搜索和替换来修补实际的SQL,但这看起来很混乱。

EN

回答 2

Stack Overflow用户

发布于 2021-07-24 09:02:11

我从未尝试过使用tsql连接到不同的服务器。你可以试着测试一下。为服务器名称设置一个表。

代码语言:javascript
运行
复制
CREATE TABLE [dbo].[ServerName](
    [SvrName] [varchar](50) NOT NULL,
 CONSTRAINT [PK__Svr] PRIMARY KEY CLUSTERED 
(
    [SvrName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[ServerName] ([SvrName]) VALUES (N'Server1')
INSERT [dbo].[ServerName] ([SvrName]) VALUES (N'Server2')
INSERT [dbo].[ServerName] ([SvrName]) VALUES (N'Server3')
INSERT [dbo].[ServerName] ([SvrName]) VALUES (N'Server4')
INSERT [dbo].[ServerName] ([SvrName]) VALUES (N'Server5')
GO

回车符没有像我希望的那样显示它,但它应该可以工作。

代码语言:javascript
运行
复制
declare @sql1 varchar(max) = ''
declare @sql2 varchar(max) = ''
; with SvrNames as (
    SELECT [SvrName]
      FROM [DBName].[dbo].[ServerName]
)
select @sql1 = STRING_AGG(' :Connect ' + [SvrName] + ' GO ' + char(10) + char(13) + 'EXECUTE sp_executesql @tsql ' + char(10) + char(13), '')
from SvrNames

select @sql2 = ' DECLARE @tsql nvarchar(500) = ''SELECT value FROM DB.dbo.Tablename''' + @sql1
--select @sql2
EXECUTE (@sql2)

上面的脚本生成并执行以下代码。

代码语言:javascript
运行
复制
DECLARE @tsql nvarchar(500) = 'SELECT value FROM DB.dbo.Tablename' 
 :Connect Server1 GO   
 EXECUTE sp_executesql @tsql    
 
 :Connect Server2 GO   
 EXECUTE sp_executesql @tsql    
 
 :Connect Server3 GO   
 EXECUTE sp_executesql @tsql    
 
 :Connect Server4 GO   
 EXECUTE sp_executesql @tsql    
 
 :Connect Server5 GO   
 EXECUTE sp_executesql @tsql   
票数 1
EN

Stack Overflow用户

发布于 2021-07-25 23:08:01

最简单的方法是创建一个单独的脚本文件-然后在每个部分中使用该脚本文件:

代码语言:javascript
运行
复制
:connect servername
:r {script file}

您还可以对其进行设置,以便SQLCMD文件构建脚本-然后每个部分都执行脚本-并在最后删除脚本:

代码语言:javascript
运行
复制
:out C:\Temp\TempScript.sql
Set NoCount On;
Declare @sqlCommand nvarchar(max) = '';
Set @sqlCommand = '
   Set NoCount On;
   {build your script}
';

Select @sqlCommand;
Go

调用该脚本文件:

代码语言:javascript
运行
复制
:setvar ScriptFile "C:\Temp\TempScript.sql"

:connect servername
:r '$(ScriptFile)'
Go

然后-删除临时脚本文件:

代码语言:javascript
运行
复制
!!del '$(ScriptFile)'

话虽如此,使用Powershell和Invoke-SqlCmd来遍历服务器列表并对每个服务器执行查询会容易得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68502352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档