使openquery中的linkserver成为从表中选取的变量

时间:2017-11-22 14:12:23

标签: sql sql-server

我的SQL Server数据库中有多个链接服务器。 我创建了一个识别主要主机的程序

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

2 个答案:

答案 0 :(得分:1)

您无法参数化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)

答案 1 :(得分:1)

假设它总是只返回一个值,你可以使用OUTPUT。

像...一样的东西。

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)

然后,只需在openquery中使用@server和动态sql