[英]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.