sql-server - 在 SQL 中使用变量并在 SQL Server Management Studio 中保持格式设置

标签 sql-server t-sql dynamic-sql

我正在创建一些 View ,其中包含对另一个数据库中的表的大量引用。

在某些时候,另一个数据库需要更改。

我想让下一个开发人员可以轻松更改脚本以使用另一个数据库。

这显然可以正常工作:

CREATE VIEW ViewName 
AS
    SELECT *
    FROM AnotherDatabase.SchemaName.TableName;

但是当我这样做时:

DECLARE @DB CHAR(100)
SET @DB = 'AnotherDatabase'
GO

CREATE VIEW ViewName 
AS
    SELECT *
    FROM @DB.SchemaName.TableName;

我收到错误:

Msg 137, Level 15, State 2, Procedure ViewName, Line 3
Must declare the scalar variable "@DB".

我可以做这样的事情:

DECLARE @SQL ...
SET @SQL = ' ... FROM ' + @DB + ' ... '
EXEC (@SQL)

但这违背了让下一个开发人员更轻松的目的 - 因为这种动态 SQL 方法删除了 SSMS 中的格式。

所以我的问题是:如何让下一个开发人员在需要交换数据库引用的地方轻松维护 T-SQL 代码?

注释:

  • 我使用的是 SQL Server 2008 R2
  • 另一个数据库位于同一服务器上。

最佳答案

考虑使用 SQLCMD 变量。这将允许您在部署时指定实际的数据库名称。运行脚本时,SQL Server 工具(SSMS、SQLCMD、SSDT)将用分配的字符串值替换 SQLCMD 变量名称。可以通过菜单选项 Query-->SQLCMD 模式选项为当前查询窗口打开 SQLCMD 模式。

:SETVAR OtherDatabaseName "AnotherDatabaseName"

CREATE VIEW ViewName AS
SELECT *
  FROM $(OtherDatabaseName).SchemaName.TableName;
GO

当 SQL 对象受源代码控制时,此方法效果最佳。

关于sql-server - 在 SQL 中使用变量并在 SQL Server Management Studio 中保持格式设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032159/

相关文章:

sql - 使用 SQL 对重复的 0 和 1 系列中的中断进行识别和分类

sql-server - 以下脚本错误

postgresql - 在 Postgresql 中使用 ILIKE 的动态 RETURN EXECUTE QUERY

sql-server - 计算运行总额/运行余额

SQL - 在另一个带有更新的身份种子的插入中插入查询

sql-server - 无法使用node js连接到mysql windows身份验证

sql - 使用 WHERE 子句的变量声明

php - 根据 php 变量在 mysql 中按周、月分组。如果条件为 group by

mysql - 在数组上过滤具有列条件的行

sql - 计算每个值的所有重复项