我有一个很奇怪的用例,不必花很多时间去解释,但是最终结果是我整天反复使用更长版本的查询:
--DECLARE @Vendor int = 1 --Vendor1
--DECLARE @Vendor int = 2 --Vendor2
DECLARE @Vendor int = 3 --Vendor3
DECLARE @DatabaseName sysname;
DECLARE @SqlScript nvarchar(MAX);
SELECT @DatabaseName =
CASE @Vendor
WHEN 1 THEN 'VENDOR1_DB'
WHEN 2 THEN 'VENDOR2_DB'
WHEN 3 THEN 'VENDOR3_db'
END
IF @DatabaseName IS NULL
RAISERROR ('Unknown Vendor (%d) specified', 16, 1, @vendor);
SET @SqlScript = N'USE ' + QUOTENAME(@DatabaseName) + N';
SELECT stuff
FROM [dbo].[table]
WHERE vendor_key = @Vendor
AND create_date > convert(varchar,getdate(),112)
';
EXECUTE sp_executesql
@SqlScript
, N'@Vendor varchar(50)'
, @vendor=@vendor;
GO
我评论需要为其运行的任何供应商。原因是当我连接到SQL Server时可以运行一个查询,它会根据要查找的供应商自动选择要使用的数据库(每个供应商都有自己的数据库)。全天不间断地运行它,所以这只是我最简单的方法。
我想念的是,我们有20台左右的服务器,每台服务器上有5-10个数据库。因此,我已连接到Server1来查询Vendor1,Vendor2或Vendor3,但是我为连接到的每个服务器编写了此查询的不同版本。因此,例如,此查询另存为Server1.sql,而我又将另一个查询另存为Server2.sql,它将在case / declare中包含Vendor4,Vendor5和Vendor6的信息。
是否有类似
的内容N'USE ' + QUOTENAME(@DatabaseName) + N'
我可以让它动态选择SQL Server吗?
这是一个完全虚构的脚本,用于演示我在说什么(对不起,我对此并不擅长)
--DECLARE @Vendor int = 1 --Vendor1
--DECLARE @Vendor int = 4 --Vendor4
DECLARE @Vendor int = 8 --Vendor8
DECLARE @DatabaseName sysname;
DECLARE @ServerName sysname; --?
DECLARE @SqlScript nvarchar(MAX);
SELECT @DatabaseName =
CASE @Vendor
WHEN 1 THEN 'VENDOR1_DB'
WHEN 4 THEN 'VENDOR4_DB'
WHEN 8 THEN 'VENDOR8_DB'
END
SELECT @ServerName =
CASE @Vendor
WHEN 1 THEN 'SERVER1.BLA.BLA'
WHEN 4 THEN 'SERVER2.BLA.BLA'
WHEN 8 THEN 'SERVER3.BLA.BLA'
END
SET @SqlScript = N'USE ' + QUOTENAME(@DatabaseName) + N';
N'USE ' + QUOTENAME(@ServerName) + N'; --I know that this doesn't actually work
SELECT stuff
FROM [dbo].[table]
WHERE vendor_key = @Vendor
AND create_date > convert(varchar,getdate(),112)
';
EXECUTE sp_executesql
@SqlScript
, N'@Vendor varchar(50)'
, @vendor=@vendor;
GO