【发布时间】: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