Sql 使openquery中的linkserver成为从表中选取的变量
我的SQL Server数据库中有多个链接服务器。 我创建了一个过程来识别主主机Sql 使openquery中的linkserver成为从表中选取的变量,sql,sql-server,Sql,Sql Server,我的SQL Server数据库中有多个链接服务器。 我创建了一个过程来识别主主机 EXEC [Schema].[Server] 此过程返回仅包含一行的表“ServerTable” ------------------ | - | Server ------------------ | 1 | server_name ------------------ 现在我想使用OPENQUERY和“ServerTable”中的一项创建一个视图 USE [Database] GO SET ANSI_
EXEC [Schema].[Server]
此过程返回仅包含一行的表“ServerTable”
------------------
| - | Server
------------------
| 1 | server_name
------------------
现在我想使用OPENQUERY和“ServerTable”中的一项创建一个视图
USE [Database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [Schema].[View] AS
SELECT
*
FROM OPENQUERY (
server_name, <-- variable to be updated depending on 'ServerTable' item
'SELECT *
FROM "_SYS_BIC"."system-local.bw.bw2hana/WHC_CP03"'
)
;
GO
使用[数据库]
去
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
创建视图[Schema].[VIEW]作为
挑选
*
来自OPENQUERY(
服务器名称,您不能参数化OPENQUERY调用,因此必须使用动态SQL
DECLARE @sql nvarchar(4000)
SET @sql = 'SELECT
*
FROM OPENQUERY (
' + server_name + '
', ''SELECT *
FROM "_SYS_BIC"."system-local.bw.bw2hana/WHC_CP03"''
)'
EXEC (@sql)
假设它总是只返回一个值,您可以使用输出
类似于
create procedure [Schema].[Server]
@someParameter theDataType,
@outPutParameter varchar(64) output
as
begin
select @outPutParameter = someColumn
from sys.servers
where someColumn = @someParameter
and isLinkedServer = 1
end
或者,如果返回多行,可以将其存储在表中
create table #temp([Server] char(64))
insert into #temp
exec [Schema].[Server]
declare @server char(64) = (select top 1 [Server] from #temp)
那么,只需在动态查询SQL/P>的OpenQuess中使用@ Server,如果您需要视图,动态SQL解决方案将不起作用,因为您不能将动态SQL填充到视图中。请考虑动态生成视图,或者设置链接服务器并使用链接服务器对象的同义词。在服务器上,您可以使用
sp_setnetname
使服务器成为您正在使用的名称以外的其他名称(但我很确定您不能以这种方式重定向实例名称)。