SQL Server:根据变量

时间:2018-10-17 16:11:24

标签: sql-server

我有一个很奇怪的用例,不必花很多时间去解释,但是最终结果是我整天反复使用更长版本的查询:

--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

0 个答案:

没有答案