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