如何在 SQL 服务器中参数化数据库名称
How to parameterize database name in SQL Server
我有服务器和数据库的列表,正在尝试在与下面相同的脚本中使用 OLTP 和 WH 数据库。
DECLARE @oltp VARCHAR(50)
SET @oltp = 'Employee'
DECLARE @wh VARCHAR(25)
SET @wh = @oltp + '_wh'
SELECT *
FROM Employee_wh..employee_sales_item --working
SELECT *
FROM @wh..employee_sales_item --not working
我收到以下异常
Msg 102, Level 15, State 1, Line 86
Incorrect syntax near '.'.
请帮助我使用声明的变量修复 @wh..employee_sales_item
。
为了用参数交换模式的任何元素(列、table、模式、数据库),您需要使用 'dynamic SQL'。
在你的情况下,它会像下面这样:
declare @sql nvarchar(400),
@db nvarchar(30)
set @db = N'Employee_wh'
set @sql = N'select * from '+@db+N'..employee_sales_item'
exec sp_executesql @sql
DECLARE @oltp VARCHAR(50)
SET @oltp = 'Employee';
DECLARE @wh VARCHAR(25)
SET @wh = '_wh';
DECLARE @DatabaseName SYSNAME = @oltp + @wh;
IF NOT EXISTS ( SELECT 1 FROM sys.databases WHERE name = @DatabaseName)
BEGIN
DECLARE @ErrorMsg VARCHAR(1000);
SET @ErrorMsg = QUOTENAME(@DatabaseName) + ' database does not exist';
RAISERROR(@ErrorMsg , 16 , 2);
END
ELSE
BEGIN
DECLARE @Sql NVARCHAR(MAX) = N'SELECT * FROM '
+ QUOTENAME(@DatabaseName)
+ N'..employee_sales_item;';
EXEC sys.sp_executesql @Sql;
END
我有服务器和数据库的列表,正在尝试在与下面相同的脚本中使用 OLTP 和 WH 数据库。
DECLARE @oltp VARCHAR(50)
SET @oltp = 'Employee'
DECLARE @wh VARCHAR(25)
SET @wh = @oltp + '_wh'
SELECT *
FROM Employee_wh..employee_sales_item --working
SELECT *
FROM @wh..employee_sales_item --not working
我收到以下异常
Msg 102, Level 15, State 1, Line 86
Incorrect syntax near '.'.
请帮助我使用声明的变量修复 @wh..employee_sales_item
。
为了用参数交换模式的任何元素(列、table、模式、数据库),您需要使用 'dynamic SQL'。
在你的情况下,它会像下面这样:
declare @sql nvarchar(400),
@db nvarchar(30)
set @db = N'Employee_wh'
set @sql = N'select * from '+@db+N'..employee_sales_item'
exec sp_executesql @sql
DECLARE @oltp VARCHAR(50)
SET @oltp = 'Employee';
DECLARE @wh VARCHAR(25)
SET @wh = '_wh';
DECLARE @DatabaseName SYSNAME = @oltp + @wh;
IF NOT EXISTS ( SELECT 1 FROM sys.databases WHERE name = @DatabaseName)
BEGIN
DECLARE @ErrorMsg VARCHAR(1000);
SET @ErrorMsg = QUOTENAME(@DatabaseName) + ' database does not exist';
RAISERROR(@ErrorMsg , 16 , 2);
END
ELSE
BEGIN
DECLARE @Sql NVARCHAR(MAX) = N'SELECT * FROM '
+ QUOTENAME(@DatabaseName)
+ N'..employee_sales_item;';
EXEC sys.sp_executesql @Sql;
END