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

时间:2015-04-28 14:38:23

标签: sql sql-server tsql openquery

不确定,是否应该使用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

1 个答案:

答案 0 :(得分:0)

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;