多くのデータベースを含む複数のリンク サーバーがあります。すべてのサーバー/データベースで特定の情報を検索し、SQL 内で 1 つの結果セットを返そうとしています。
サーバー設定/ファイアウォールを変更せずに、リンクサーバーからの挿入を許可する方法を探しています。
リンクされたサーバー上にテーブルを作成し、それらをプルすることを考えましたが、それはしたくありません。主な理由は、一度に多くの人がこれを実行することになり、ずさんな感じがするからです。
いくつかの構文の問題がある場合は、申し訳ありませんが、特定の情報を削除しました。
このコードでエラーが発生しました。
(影響を受ける 2 行) リンク サーバー "server1" の OLE DB プロバイダー "SQLNCLI10" は、"トランザクション マネージャーがリモート/ネットワーク トランザクションのサポートを無効にしました。" というメッセージを返しました。メッセージ 7391、レベル 16、状態 2、行 3 リンク サーバー "server1" の OLE DB プロバイダー "SQLNCLI10" が分散トランザクションを開始できなかったため、操作を実行できませんでした。
これまでのところ、私は持っています:
DECLARE @SERVER VARCHAR(20),@EmpNo VARCHAR(10)
SET @EmpNo = '0000000001'
CREATE TABLE #EMPNOLOCATIONTEMP ( ServerName nvarchar(50),CompanyCode nvarchar(20), EmpNo nvarchar(20), Name nvarchar(500) )
DECLARE @TEMP TABLE (servername nvarchar(50)) -- remove and find table with information
insert into @TEMP
values('server1'),('server2'),('server3')
DECLARE db_cursor CURSOR FOR
SELECT ServerName
FROM @TEMP
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @SERVER
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #EMPNOLOCATIONTEMP
--EXECUTE [dbo].usp_Ulti_EmpNo_Search @EmpNo,@SERVER
EXECUTE('
EXECUTE(''
CREATE table #Results (CompanyCode nvarchar(20), EmpNo nvarchar(20), Name nvarchar(500))
EXECUTE sp_MSforeachdb ''''USE ?;
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''''''''[dbo].[TableWithInfo]'''''''') )
BEGIN
INSERT INTO #Results
select CompanyCode,EmpNo,Name
from TableWithInfo
where EmpNo = '''''''''+@EmpNo+'''''''''
END
''''
SELECT * FROM #Results
'') AT '+@SERVER+'
')
UPDATE #EMPNOLOCATIONTEMP SET ServerName = @SERVER WHERE ServerName is null
FETCH NEXT FROM db_cursor INTO @SERVER
END
CLOSE db_cursor
DEALLOCATE db_cursor
SELECT * FROM #EMPNOLOCATIONTEMP
DROP TABLE #EMPNOLOCATIONTEMP
前もって感謝します。