【问题标题】:Issue with Bracketed Identifier inside SQL Server OPENQUERYSQL Server OPENQUERY 中带括号的标识符的问题
【发布时间】:2015-07-07 11:38:17
【问题描述】:

不确定,这是否应该在 Stack Overflow 或 DBA 部分进行。

我正在编写的程序有问题。我有一个变量,可以说:

SET @name sysname --also tried to make as varchar

这在游标内使用,基本上包含 SQL Server 名称。几个服务器名称后跟实例名称。例如

DECLARE @name = 'SERVER1\INSTANCE1'

在光标内,我有这个查询。

SELECT @name, * FROM OPENQUERY(@name,
                      'SELECT 
                            i.Name, 
                            i.database_id, 
                            b.mirroring_state 

                            FROM msdb.sys.databases i
                            INNER JOIN msdb.sys.database_mirroring b
                            ON i.database_id = b.database_id
                            WHERE b.mirroring_state IS NOT NULL')

由于@name 中的\ 而不起作用

但是,如果我尝试一下,它会完美运行。

SELECT 'SERVER1\INSTANCE1', * FROM OPENQUERY([SERVER1\INSTANCE1],

我遇到的问题是尝试在 OPENQUERY 中使用带有 @name 的括号标识符。

我尝试了几件事,包括OPENQUERY('['+@name+']',的各种组合

如果您只是尝试FROM OPENQUERY([@name],,SQL Server 会将其解析为 @name。

关于如何使用servername\instance 名称而不遇到这些问题有什么想法吗?

编辑,完整的代码部分:

 DECLARE @name sysname,
        @sql nvarchar(4000)

 DECLARE c1 CURSOR FOR 
                SELECT SUBSTRING (Servername, 2, LEN(Servername)-2) 
                FROM AllServers
OPEN c1
    FETCH NEXT FROM c1
    INTO @name
    WHILE @@FETCH_STATUS = 0
    BEGIN

            set @sql = 'INSERT INTO MirrorResults
                            SELECT ''[' + @name + ']'', * FROM OPENQUERY([' + @name + '], 
                                ''
                                SELECT 
                                    i.Name, 
                                    i.database_id, 
                                    b.mirroring_state 
                                from msdb.sys.databases i
                                INNER JOIN msdb.sys.database_mirroring b
                                ON i.database_id = b.database_id
                                WHERE b.mirroring_state IS NOT NULL
                            '')'


        EXECUTE sys.sp_executesql @sql;
        FETCH NEXT FROM c1
    END
CLOSE c1
DEALLOCATE c1

【问题讨论】:

  • 是的,使用动态 SQL
  • 嘿@Lamak,很抱歉我的网络和stackoverflow有问题。整个sql都在sql里面,正在被sp_executesql执行
  • 那么你应该发布你的实际相关代码
  • @Lamak 添加了完整代码。
  • 请问您遇到了什么问题?是错误吗?如果是,请贴出错误信息

标签: sql sql-server tsql openquery


【解决方案1】:

OPENQUERY 只能与有效的链接服务器引用一起使用。根据 MSDN:

OPENQUERY ( linked_server ,'query' )

linked_server

是表示链接服务器名称的标识符。

所以你不能使用servername\instance 作为第一个参数。您必须先创建一个链接服务器,然后使用链接服务器名称作为第一个参数。

使用动态 SQL 的示例:

DECLARE @linked_server VARCHAR(20), @sql NVARCHAR(512);

SET @linked_server = 'SERVER1\INSTANCE1';
SET @sql = 'SELECT * FROM OPENQUERY([' + @linked_server + '], ''SELECT * FROM SomeTable;'');';

EXEC sys.sp_executesql @sql;

【讨论】:

  • 感谢@Stan Bruce 的建议。但是所有链接的服务确实存在,并且它的格式为 servername\instancename,除非只有默认实例存在,否则它只是 servername。
  • @Arun 你确定你真的创建了一个Linked Server吗?它不仅仅是一个普通的服务器,它是一个需要在 SQL Server 中定义的独特对象。例如,您是否按照以下链接创建了此链接服务器:Create Linked Servers (SQL Server)
  • @TT。是的,我在这个列表中有数百个链接服务器。如果您查看您列出的示例,他们也列出了实例。 N'SRVR002\ACCTG
  • @Arun 好的,请仔细检查 :)。是否有可能您必须省略实例名称?这只是一个疯狂的猜测......
  • @TT,不,我确定它只是 openquery 中的 []。它在没有变量的情况下工作。例如,如果我手动输入 [server\instance] 它可以工作,只有在存在 @variable 时才会出错。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2012-04-21
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多