如何在动态 SQL 和 visual studio 中为 SQL 服务器项目使用数据库变量名称?

How to use a Database Variable Name in dynamic SQL with visual studio for a SQL Server Project?

在 Visual Studio 中有没有办法在 SQL 服务器项目的动态 SQL 中使用 数据库变量名 ?或者,是否有替代解决方案?

我有一个 SQL 服务器数据库的项目,其中引用了其他数据库项目,每个项目都设置了 数据库变量名 。例如,数据库变量名将是$(PROD),我已经使用这个数据库变量名发布了使用TEST数据库的项目.

我当前的项目正在使用动态 sql,我希望能够使用 PROD 或 TEST 数据库发布该项目。我宁愿不使用 @database 变量,简单地使用 SELECT @database = $(PROD) 是行不通的。

例如,下面我在存储过程中使用 QUOTENAME(@database) 动态 SQL,我希望能够替换 @database 变量并使用 $(PROD) 或者在我发布项目时设置数据库名称的一些方法。

DECLARE 
  @sql NVARCHAR(MAX),
  @database SYSNAME,
  @schema SYSNAME,
  @table SYSNAME;
CREATE TABLE #src_pk(SrcColumn VARCHAR(100));

SELECT @sql = N'SELECT QUOTENAME(b.[COLUMN_NAME]) AS [Column] 
                  FROM ' + QUOTENAME(@database) + N'.[INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] a 
                  JOIN ' + QUOTENAME(@database) + N'.[INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] b 
                    ON a.[CONSTRAINT_NAME] = b.[CONSTRAINT_NAME] 
                 WHERE a.[CONSTRAINT_SCHEMA] = ' + QUOTENAME(@schema, '''') + N'
                   AND a.[TABLE_NAME] = ' + QUOTENAME(@table, '''') + N'
                   AND a.[CONSTRAINT_TYPE] = ''PRIMARY KEY'' '
INSERT INTO #src_pk EXEC sys.sp_executesql @sql;

我正在使用 Visual Studio 2019;项目语言在SQL;而且,我的项目平台是 SQL Server 2017.

可以直接在动态中使用项目部署变量SQL,一定要正确引用:

SELECT @sql = N'SELECT QUOTENAME(b.[COLUMN_NAME]) AS [Column] 
                  FROM ' + QUOTENAME('$(DatabaseName)') + N'.[INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] a 
                  JOIN ' + QUOTENAME('$(DatabaseName)') + N'.[INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] b 
                    ON a.[CONSTRAINT_NAME] = b.[CONSTRAINT_NAME] 
                 WHERE a.[CONSTRAINT_SCHEMA] = ' + QUOTENAME(@schema, '''') + N'
                   AND a.[TABLE_NAME] = ' + QUOTENAME(@table, '''') + N'
                   AND a.[CONSTRAINT_TYPE] = ''PRIMARY KEY'' '