如何避免在 SQL 同义词创建中硬编码数据库名称

How to avoid hard coding DB name in SQL synonym creation

使用 SQL Server 2008 R2。我有一个包含以下语句的脚本:

create synonym [synonym_name] for [linkedServerName].[databaseName].[ext].[tableName1]
create synonym [synonym_name] for [linkedServerName].[databaseName].[ext].[tableName2]

问题: 1.有什么办法可以避免4部分命名。特别是硬编码的数据库名称

  1. 已有一个用于创建 LinkedServer 的脚本。可以在创建同义词时使用吗?

  2. 为多个 Table/Views 创建同义词的最佳方法是什么?

    declare @Server sysname,
    @db sysname,
    @Schema sysname,
    @Table sysname,
    @statement varchar(max)
    
    SELECT @Server = 'Venice',
    @db = 'venice1', 
    @Schema = 'ext'
    
    EXEC('CREATE SYNONYM synonym_name1  FOR '+ @Server +'.'+ @db +'.' + @Schema  + '.Table1')
    EXEC('CREATE SYNONYM synonym_name2  FOR '+ @Server +'.'+ @db +'.' + @Schema  + '.Table2') 
    

思考:只有这样吗?

试试这个:

declare @Server sysname,
        @db sysname,
        @Schema sysname,
        @Table sysname,
        @statement varchar(max)

SELECT @Server = 'ServerName',
       @db = 'DatabaseName',
       @Schema = 'SchemaName',
       @Table = 'TableName'

set @statement = 'CREATE SYNONYM synonym_Name  FOR '+
                  @Server +'.'+ 
                  @db +'.' + 
                  @Schema  + '.' + 
                  @Table 

EXEC (@statement)

是的,这是唯一的方法。根据 MSDN documentationSynonym 创建语法需要数据库名称,如下所示,除非您正在寻求动态 SQL.

的帮助
-- SQL Server Syntax

CREATE SYNONYM [ schema_name_1. ] synonym_name FOR <object>

<object> :: =
{
    [ server_name.[ database_name ] . [ schema_name_2 ]. object_name 
}