首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server :基于变量动态更改SELECT语句中的数据库名称

SQL Server :基于变量动态更改SELECT语句中的数据库名称
EN

Stack Overflow用户
提问于 2018-06-11 04:18:43
回答 1查看 248关注 0票数 0

我有一个主要看起来像这样的查询:

 DECLARE @Vendor varchar (50)
--SET @Vendor = 55 --One vendor
--Set @Vendor = 234 --Another vendor
--SET @Vendor = 123 --Another vendor

SELECT column1, column2, column3
FROM [dbo].[TABLE1]
WHERE vendor_key = @Vendor
  AND create_date > CONVERT(VARCHAR, GETDATE(), 112)
ORDER BY column1;

SELECT column1, column2, column3
FROM [dbo].[TABLE2]
WHERE vendor_key = @Vendor
  AND create_date > CONVERT(VARCHAR, GETDATE(), 112)
ORDER BY column1;

我循环浏览被注释掉的供应商编号列表,不注释我需要的任何供应商的信息。(这比上面列出的3个列表要长得多。这使我可以对所有供应商使用一个查询,而不必记住供应商编号)。

唯一令人恼火的是,同一服务器上有一堆不同的数据库,根据供应商的不同,我需要从下拉列表中手动选择正确的数据库。

理想情况下,我希望编写某种IF语句来设置数据库名称,或者替换表名前面的"dbo“,这取决于上面设置的供应商编号。

所以就像,

IF @Vendor = 55 
   SET @database = "Vendor1DB", 
ELSE IF @Vendor = 234 
   SET @database = "Vendor2DB" (and so on)

这个是可能的吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-11 05:11:55

动态SQL是一种方法:

DECLARE @vendor int = 55;
DECLARE @DatabaseName sysname;
DECLARE @SqlScript nvarchar(MAX);

SELECT @DatabaseName =
    CASE @vendor
        WHEN 55 THEN  'OneVendor'
        WHEN 234 THEN 'AnotherVendor'
        WHEN 123 THEN 'YetAnotherVendor'
    END;
IF @DatabaseName IS NULL
    RAISERROR( 'Unknown vendor (%d) specified', 16, 1, @vendor);
SET @SqlScript = N'USE ' + QUOTENAME(@DatabaseName) + N';
SELECT column1, column2, column3
FROM [dbo].[TABLE1]
WHERE vendor_key = @Vendor
  AND create_date > CONVERT(VARCHAR, GETDATE(), 112)
ORDER BY column1;

SELECT column1, column2, column3
FROM [dbo].[TABLE2]
WHERE vendor_key = @Vendor
  AND create_date > CONVERT(VARCHAR, GETDATE(), 112)
ORDER BY column1;
';
EXECUTE sp_executesql 
      @SqlScript
    , N'@Vendor varchar(50)'
    , @vendor=@vendor;
GO

另一种方法是在SQLCMD模式下从SSMS运行SQLCMD脚本(查询-->SQLCMD模式)。不幸的是,没有一种简单的方法来动态设置SQLCMD变量。下面的示例使用T-SQL生成并使用the technique described here执行所需的SETVAR命令。

--redirect STDOUT to file
:out d:\temp\UseStatement.sql
GO

--generate file with :SETVAR DatabaseName
DECLARE @vendor int = 55;
DECLARE @SetVarCommand nvarchar(200);
SELECT @SetVarCommand =
    CASE @vendor
        WHEN 55 THEN  ':SETVAR DatabaseName OneVendor;'
        WHEN 234 THEN ':SETVAR DatabaseName AnotherVendor;'
        WHEN 123 THEN ':SETVAR DatabaseName YetAnotherVendor;'
    END;
IF @SetVarCommand IS NULL
    RAISERROR( 'Unknown vendor (%d) specified', 16, 1, @vendor);
PRINT @SetVarCommand;
GO

--redirect STDOUT to default
:out stdout
GO

--execute SETVAR script for DatabaseName
:r d:\temp\UseStatement.sql
GO
--specify $(DatabaseName) in your sql script where the database name is needed
USE $(DatabaseName);
SELECT column1, column2, column3
FROM [dbo].[TABLE1]
WHERE vendor_key = @Vendor
  AND create_date > CONVERT(VARCHAR, GETDATE(), 112)
ORDER BY column1;

SELECT column1, column2, column3
FROM [dbo].[TABLE2]
WHERE vendor_key = @Vendor
  AND create_date > CONVERT(VARCHAR, GETDATE(), 112)
ORDER BY column1;
GO
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50787690

复制
相关文章

相似问题

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