我有一个主要看起来像这样的查询:
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)
这个是可能的吗?
发布于 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
https://stackoverflow.com/questions/50787690
复制相似问题