В случае, если представления не подходят для вас, я написал следующий код, основанный на ответе Аарона Бертранда здесь , который даст оператор вставки для одной записи в БД.
CREATE PROCEDURE dbo.GenerateSingleInsert
@table NVARCHAR(511), -- expects schema.table notation
@pk_column SYSNAME, -- column that is primary key
@pk_value NVARCHAR(10) -- 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 + ' + '','' + ' + 'ISNULL('+REPLICATE(CHAR(39),4)+'+RTRIM(' +
CASE WHEN system_type_id IN (40,41,42,43,58,61) -- dateteime and time stamp type
THEN
'CONVERT(CHAR(8), ' + QUOTENAME(name) + ', 112) + '' ''+ CONVERT(CHAR(14), ' + QUOTENAME(name) + ', 14)'
WHEN system_type_id IN (35) -- text type
THEN
'REPLACE(CAST(' + QUOTENAME(name) + 'as nvarchar(MAX)),'+REPLICATE(CHAR(39),4)+','+REPLICATE(CHAR(39),6)+')'
ELSE
'REPLACE(' + QUOTENAME(name) + ','+REPLICATE(CHAR(39),4)+','+REPLICATE(CHAR(39),6)+')'
END
+ ')+' + REPLICATE(CHAR(39),4) + ',''null'') + '
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),2) + STUFF(@vals, 1, 6, '') + 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
Я взял приведенный выше код и упаковал его в следующий процесс, который будет использовать предложенное вами предложение where для выбора операторов вставки для создания
CREATE PROCEDURE dbo.GenerateInserts
@table NVARCHAR(511), -- expects schema.table notation
@pk_column SYSNAME, -- column that is primary key
@whereClause NVARCHAR(500) -- the where clause used to parse down the data
AS
BEGIN
declare @temp TABLE ( keyValue nvarchar(10), Pos int );
declare @result TABLE ( insertString nvarchar(MAX) );
declare @query NVARCHAR(MAX)
set @query =
'with qry as
(
SELECT ' + @pk_column + ' as KeyValue, ROW_NUMBER() over(ORDER BY ' + @pk_column + ') Pos
from ' + @table + '
' + @whereClause + '
)
select * from qry'
insert into @temp
exec sp_sqlexec @query
Declare @i int, @key nvarchar(10)
select @i = count(*) from @temp
WHILE @i > 0 BEGIN
select @key = KeyValue from @temp where Pos = @i
insert into @result
exec [dbo].[GenerateSingleInsert] @table, @pk_column, @key
set @i = @i - 1
END
select insertString from @result
END
Вызов может выглядеть следующим образом. Вы передаете имя таблицы, первичный ключ таблицы и предложение where, и в итоге вы должны получить операторы вставки.
set @whereClause = 'where PrettyColorsId > 1000 and PrettyColorsID < 5000'
exec [dbo].GenerateInserts 'dbo.PrettyColors', 'PrettyColorsID', @whereClause
set @whereClause = 'where Color in (' + @SomeValues + ')'
exec [dbo].GenerateInserts 'dbo.PrettyColors', 'PrettyColorsID', @whereClause