如何在 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