Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使openquery中的linkserver成为从表中选取的变量_Sql_Sql Server - Fatal编程技术网

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

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_

我的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
使用[数据库]
去
将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
使服务器成为您正在使用的名称以外的其他名称(但我很确定您不能以这种方式重定向实例名称)。