【问题标题】:Set SQLCMD parameter to LinkedServer将 SQLCMD 参数设置为链接服务器
【发布时间】:2020-07-09 18:08:19
【问题描述】:

我有一个 VisualStudio SQL 项目,我需要将 SQLCMD 参数设置为链接服务器的值。

假设项目中有以下查询:

select * from tableName

我需要将其更改为:

select * from [$(linkedServer)].tableName

其中linkedServer = serverName.dbName.dbo 这转换为:

select * from [serverName.dbName.dbo].tableName

导致错误:

无效的对象名称'serverName.dbName.dbo.tableName'。

但是,以下查询运行成功:select * from serverName.dbName.dbo.tableName

有没有办法删除括号或其他解决方法?需要括号,因为该值是作为 SQLCMD 参数传递的。

【问题讨论】:

    标签: sql sql-server linked-server sqlcmd


    【解决方案1】:

    [serverName.dbName.dbo].tableName 失败的原因是因为 SQL 会将 [] 之间的所有内容视为单个标识符。所以它正在一个名为 serverName.dbName.dboschema 中寻找一个名为 tableName 的对象。

    当您填充 sqlcmd 变量时,使用方括号对其进行填充,以便生成有效的 4 部分名称:[serverName].[dbName].[dbo].tableName

    针对自动部署/visual studio intellisense 的情况进行编辑:

    如果您通过 VS 生成的脚本进行自动部署替换,您可以为链接服务器和数据库创建单独的变量,或者您可以保留一个变量并使用带引号的标识符“欺骗”系统。将您的变量设置为 serverName”.”dbName"."dbo(注意 - 没有开头引号,在句点的两边加上引号),并在您的脚本中使用 "$(linkedServer)"

    【讨论】:

    • 这会将值设置为: [[serverName]].[dbName]].[dbo]]].tableName 。这也会导致同样的错误。
    • 啊,我明白了,您正在通过 VS 生成的脚本进行自动部署替换。您可以为链接服务器和数据库创建单独的变量,或者您可以保留一个变量并使用带引号的标识符“欺骗”系统。将您的变量设置为“serverName”.”dbName”.“dbo`(注意 - 没有开头引号,在句点的两边加上引号),并在您的脚本中使用 "$(linkedServer)"
    • 是的,我认为这也是更清洁的选择
    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 2020-12-07
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多