SELECTがレコードを返す場合、INSERTは影響を受けるレコードの数を除いて結果セットを返しません。これは、SET NOCOUNT ONを使用することで抑止できます。しかし、抑制が可視性を参照するか、行数が実際に来るかどうかはわかりません。
INSERT INTO OPENQUERY(MYSERVER, 'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [Blah].[dbo].[SQL_Drives]')
SELECT 'X', 2, 'MyServer'
(1 row(s) affected)
INSERTから返されるレコードは、OUTPUT句を使用する唯一の方法です。クライアント・マシンは、OUTPUT INSERTED行にアクセスできないため、戻されません。あなたは次のことを実行しようとすると、エラーが表示されます:
INSERT INTO OPENQUERY(MYSERVER, 'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [BLAH].[dbo].[SQL_Drives]')
OUTPUT INSERTED.*
SELECT 'X', 2, 'MyServer'
Msg 405, Level 16, State 1, Line 1
A remote table cannot be used as a DML target in a statement which includes an OUTPUT clause or a nested DML statement.
-- EDIT RESULTS OF PROFILER ---------------------------
-- Statements that occured on server called through OPENQUERY
exec sp_cursoropen @p1 output,N'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [MyServer].[dbo].[SQL_Drives]',@p3 output,@p4 output,@p5 output
select @p1, @p3, @p4, @p5
exec sp_cursor 180150009,4,0,N'[MyServer].[dbo].[SQL_Drives]',@Drive_Letter='X',@MBFree=2,@Server='MyServer'
--Statements that occured on client
INSERT INTO OPENQUERY(MyServer, 'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [MyServer].[dbo].[SQL_Drives]')
SELECT 'X', 2, 'MyServer'
FYI:2番目の例の4つの部分の名前付け構文は、リンクサーバータイプが分散トランザクションに登録されている場合にのみ機能します。 (ほとんどの場合、ちょっとしたことです) –
最初のクエリでは、selectを使用して列を指定せずに挿入する列をどのように決定していますか? – Abs
完全な挿入は、アイデンティティデータまたはデフォルトデータ(ほとんどの場合、デフォルトデータも書き込む)で列を残してしまいます。通常、レコードセット全体をデータのまとまりとして書き込むために、挿入するレコードセット全体を与える方が高速です。 openqueryは、列が挿入順であると想定しています(通常の挿入がそうであるように)。 True:非連続列を具体化する必要がある場合は、選択肢を使用する必要がありますが、パフォーマンスは低下します – Zelloss