2017-11-22 16 views
1

SQL Serverデータベースに複数のリンクサーバーがあります。 は、私は、プライマリホストテーブルから選択された変数openqueryでlinkserverを作成します

EXEC [Schema].[Server] 

この手順は、1行今

------------------ 
| - | Server 
------------------ 
| 1 | server_name 
------------------ 

私はOPENQUERYを使用してビューを作成したいとテーブル「のserverTable」を返すと、一つのアイテムを識別するための手順を作成しました'の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 
+1

動的SQLをビューに含めることができないため、回答が提示された動的SQLソリューションは、ビューが必要な場合は機能しません。ビュー*を動的に生成すること、またはリンクされたサーバーを設定し、リンクされたサーバーオブジェクトに同義語を使用することを検討してください。問題のリモートサーバがSQL Serverの場合、 'sp_setnetname'を使用して、使用している名前以外のサーバにすることができます(ただし、インスタンス名をそのようにリダイレクトすることはできません)。 –

答えて

1
あなたはOPENQUERYを使用して、動的SQLを使用する必要がありそう呼び出すparametriseすることはできません

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) 

何か、ただ動的SQLを使用してOPENQUERYに@server使用

関連する問題