Trường hợp SELECT sẽ trả về các bản ghi, INSERT sẽ không trả lại tập kết quả ngoại trừ số lượng bản ghi bị ảnh hưởng. Điều này có thể bị chặn bằng cách sử dụng SET NOCOUNT ON; tuy nhiên, tôi không chắc chắn liệu sự đàn áp có liên quan đến khả năng hiển thị hay số lượng hàng thực sự đến.
INSERT INTO OPENQUERY(MYSERVER, 'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [Blah].[dbo].[SQL_Drives]')
SELECT 'X', 2, 'MyServer'
(1 row(s) affected)
Đối với hồ sơ được trả về từ INSERT, cách duy nhất để thực hiện điều đó xảy ra là sử dụng mệnh đề OUTPUT. Máy khách sẽ không có quyền truy cập vào các hàng OUTPUT INSERTED do đó không thể trả về các hàng này. Nếu bạn cố gắng chạy những điều sau, bạn sẽ nhận được thông báo lỗi:
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'
Chỉ cần thông tin: Cú pháp đặt tên bốn phần trong ví dụ thứ hai chỉ hoạt động nếu loại Máy chủ được Liên kết đã được đăng ký vào Giao dịch Phân tán. (Hầu hết là, chỉ cần một hình ảnh xác thực.) –
Với truy vấn đầu tiên của bạn, bạn xác định các cột để chèn vào mà không chỉ định các cột thông qua một lựa chọn như thế nào? – Abs
Tôi thực hiện việc chèn hoàn chỉnh chỉ để lại các cột có dữ liệu nhận dạng hoặc dữ liệu mặc định (hầu hết thời gian tôi cũng ghi dữ liệu mặc định). Thông thường là nhanh hơn để cung cấp cho toàn bộ recordset để chèn khi nó viết nó như một đoạn dữ liệu. Các openquery giả định rằng các cols là trong thứ tự chèn (như chèn bình thường làm). True: nếu bạn cần phải especify cols liên tiếp bạn cần phải sử dụng lựa chọn, nhưng với chi phí hiệu suất – Zelloss