简体   繁体   English

SQL Server OPENQUERY中包含Bracketed标识符的问题

[英]Issue with Bracketed Identifier inside SQL Server OPENQUERY

Not sure, if this should go on Stack Overflow, or the DBA section. 不确定,这应该是Stack Overflow还是DBA部分。

Having an issue with a procedure I'm writing. 我正在写一个程序的问题。 I have a variable, lets say: 我有一个变量,让我们说:

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

This is used inside a cursor, and will basically contain SQL Server names. 这在游标中使用,基本上包含SQL Server名称。 Several of the server names are followed by instances names. 一些服务器名称后跟实例名称。 For example 例如

DECLARE @name = 'SERVER1\INSTANCE1'

Inside the cursor, I have this query. 在光标内部,我有这个查询。

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')

which doesn't work because of the \\ inside the @name 因为@name中的\\而无效

However, if I try this, it works perfectly. 但是,如果我试试这个,那就完美了。

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

The issue I'm having is trying to use the bracketed identifier with the @name inside the OPENQUERY. 我遇到的问题是尝试在OPENQUERY中使用带括号的标识符和@name

I have tried several things, including various combinations of OPENQUERY('['+@name+']', 我尝试了几件事,包括OPENQUERY('['+@name+']',各种组合OPENQUERY('['+@name+']',

If you just try FROM OPENQUERY([@name], SQL Server parses it literally as @name. 如果您只是尝试FROM OPENQUERY([@name], SQL Server将其字面解析为@name。

Any ideas on how to use the servername\\instance name without having these issues? 有关如何使用servername\\instance name而没有这些问题的任何想法?

Edit, full section of the code: 编辑,完整的代码部分:

 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

OPENQUERY can only be used with a valid linked server reference. OPENQUERY只能与有效的链接服务器引用一起使用。 As per MSDN: 根据MSDN:

OPENQUERY ( linked_server ,'query' )

linked_server linked_server

Is an identifier representing the name of the linked server. 是表示链接服务器名称的标识符。

So you can't use servername\\instance as the first parameter. 所以你不能使用servername\\instance作为第一个参数。 You'll have to create a linked server first, and then use the linked server name as the first parameter. 您必须首先创建链接服务器,然后使用链接服务器名称作为第一个参数。

An example using dynamic SQL: 使用动态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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM