我有一个固定的SQL Server 2019 (v15) Express数据库列表,分布在全国各地。我希望编写一种在T-SQL批处理中查询它们的方法。已经到了启用SQLCMD并运行这个的地步。
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,但这看起来很混乱。
发布于 2021-07-24 01:02:11
我从未尝试过使用tsql连接到不同的服务器。你可以试着测试一下。为服务器名称设置一个表。
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
回车符没有像我希望的那样显示它,但它应该可以工作。
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)
上面的脚本生成并执行以下代码。
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
发布于 2021-07-25 15:08:01
最简单的方法是创建一个单独的脚本文件-然后在每个部分中使用该脚本文件:
:connect servername
:r {script file}
您还可以对其进行设置,以便SQLCMD文件构建脚本-然后每个部分都执行脚本-并在最后删除脚本:
:out C:\Temp\TempScript.sql
Set NoCount On;
Declare @sqlCommand nvarchar(max) = '';
Set @sqlCommand = '
Set NoCount On;
{build your script}
';
Select @sqlCommand;
Go
调用该脚本文件:
:setvar ScriptFile "C:\Temp\TempScript.sql"
:connect servername
:r '$(ScriptFile)'
Go
然后-删除临时脚本文件:
!!del '$(ScriptFile)'
话虽如此,使用Powershell和Invoke-SqlCmd来遍历服务器列表并对每个服务器执行查询会容易得多。
https://stackoverflow.com/questions/68502352
复制相似问题