【问题标题】:How to use a Database Variable Name in dynamic SQL with visual studio for a SQL Server Project?如何在 SQL Server 项目的 Visual Studio 中使用动态 SQL 中的数据库变量名称?
【发布时间】:2019-11-19 16:08:44
【问题描述】:

Visual Studio 中有没有一种方法可以在 SQL Server 项目的动态 SQL 中使用 数据库变量名称?或者,是否有替代解决方案?

我有一个 SQL Server 数据库项目,其中引用了其他数据库项目,每个项目都设置了 数据库变量名称。例如,数据库变量名$(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。

【问题讨论】:

  • 为什么不将$(PROD) 作为参数传递?您最好使用您在 Visual Studio 中使用的语言进行标记并向我们展示您的代码。
  • 谢谢@Larnu。您的意思是将$(PROD) 作为参数传递给sys.sp_executesql 吗?
  • 我的意思是在您的应用程序代码中使用参数化查询。考虑到我们不知道那种语言是什么,我不能告诉你怎么做。
  • 是Visual Studio中的数据库项目,所以语言是TSQL。如果你想在任何分配中使用项目变量,你需要在它周围加上引号,比如 SELECT @database = '$(PROD)'
  • 谢谢@Piotr。实际上,在将这个问题放在一起时,我也在某个地方读过;但是,我没有测试它,因为我认为它不会起作用。是的,SELECT @database = $(PROD) 不起作用,SELECT @database = '$(PROD)' 起作用。我现在可以发布项目,它将是 SELECT @database = 'TEST' 或我将 Database Variable Name 值设置为的任何值。

标签: sql sql-server visual-studio visual-studio-2019 sql-server-2017


【解决方案1】:

你可以直接在动态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'' '

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多