【发布时间】: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