Trong trường hợp cụ thể của bạn tôi nghĩ bạn có thể làm điều này:
CREATE PROCEDURE dbo.GenerateSingleInsert
@table NVARCHAR(511), -- expects schema.table notation
@pk_column SYSNAME, -- column that is primary key
@pk_value INT -- change data type accordingly
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cols NVARCHAR(MAX), @vals NVARCHAR(MAX),
@valOut NVARCHAR(MAX), @valSQL NVARCHAR(MAX);
SELECT @cols = N'', @vals = N'';
SELECT @cols = @cols + ',' + QUOTENAME(name),
@vals = @vals + ' + ' + REPLICATE(CHAR(39),3) + ','
+ REPLICATE(CHAR(39),3) + ' + ' + REPLICATE(CHAR(39),2) + '+'
+ 'RTRIM(' + CASE WHEN system_type_id IN (40,41,42,43,58,61) THEN
'CONVERT(CHAR(8), ' + QUOTENAME(name) + ', 112) + '' ''
+ CONVERT(CHAR(14), ' + QUOTENAME(name) + ', 14)'
ELSE 'REPLACE(' + QUOTENAME(name) + ','''''''','''''''''''')' END + ')
+ ' + REPLICATE(CHAR(39),2)
FROM sys.columns WHERE [object_id] = OBJECT_ID(@table)
AND system_type_id <> 189 -- can't insert rowversion
AND is_computed = 0; -- can't insert computed columns
SELECT @cols = STUFF(@cols, 1, 1, ''),
@vals = REPLICATE(CHAR(39), 4) + ' + ' + STUFF(@vals, 1, 13, '')
+ REPLICATE(CHAR(39), 2);
SELECT @valSQL = N'SELECT @valOut = ' + @vals + ' FROM ' + @table + ' WHERE '
+ QUOTENAME(@pk_column) + ' = ''' + RTRIM(@pk_value) + ''';';
EXEC sp_executesql @valSQL, N'@valOut NVARCHAR(MAX) OUTPUT', @valOut OUTPUT;
SELECT SQL = 'INSERT ' + @table + '(' + @cols + ') SELECT ' + @valOut;
END
GO
Vì vậy, hãy thử nó ra:
CREATE TABLE dbo.splunge
(
ID INT, dt DATETIME, rv ROWVERSION, t NVARCHAR(MAX)
);
INSERT dbo.splunge(ID, dt, t)
SELECT 1, GETDATE(), 'foo'
UNION ALL SELECT 2, GETDATE(), 'bar'
UNION ALL SELECT 3, GETDATE(), 'O''Brien';
EXEC dbo.GenerateSingleInsert N'dbo.splunge', N'ID', 1;
SQL
-------------
INSERT dbo.splunge([ID],[dt],[t]) SELECT '1','20120517 10:07:07:330','foo'
EXEC dbo.GenerateSingleInsert N'dbo.splunge', N'ID', 2;
SQL
-------------
INSERT dbo.splunge([ID],[dt],[t]) SELECT '2','20120517 10:07:07:330','bar'
EXEC dbo.GenerateSingleInsert N'dbo.splunge', N'ID', 3;
SQL
-------------
INSERT dbo.splunge([ID],[dt],[t]) SELECT '3','20120517 10:07:07:330','O''Brien'
Nếu có một cột IDENTITY bạn có thể cần phải thiết lập SET IDENTITY_INSERT ON cho bảng TEST và xác minh rằng không có xung đột. Có lẽ khoảng 500 cảnh báo tôi nên đề cập đến, tôi chưa thử nghiệm tất cả các loại dữ liệu, v.v.
Tuy nhiên, trong trường hợp tổng quát hơn, có lô nhiều hơn thế. Vyas K có một thủ tục lưu trữ khá mạnh mẽ mà phải chứng minh như thế nào phức tạp nó có thể nhận được:
http://vyaskn.tripod.com/code/generate_inserts_2005.txt
Bạn đang có lẽ tốt hơn bằng cách sử dụng một công cụ như Red-Gate's SQL Data Compare để chọn một hàng cụ thể và tạo ra một chèn cho bạn. As I've blogged about, trả tiền cho một công cụ không chỉ là về số tiền, mà còn về số giờ khắc phục sự cố và sửa lỗi mà người khác đã thực hiện cho bạn.
lược đồ bảng? điều kiện? có những người khá thông minh ở đây nhưng không ai trong số họ là tiên tri: P –
Tôi vừa cập nhật câu hỏi. Cảm ơn. – user70192