Вставить скрипт для определенного набора строк в SQL
Я использую SQL Server 2008. Я использую сценарий своих данных из таблицы SQL, используя параметр «Задачи -> Генерировать скрипты».
Вот моя проблема:
Допустим, у меня 21 000 записей в таблице Employee
. Когда я беру скрипт этой таблицы, он принимает скрипт вставки для всех 21000 записей. Каково решение, если я хочу взять только скрипт из 18000 записей из таблицы?
- Проблема с вложением в базу данных SQL Server с Java
- Синтаксис SQL Server INSERT
- SQL Server - как вставить запись и убедиться, что она уникальна
- Есть ли лучший способ получить уникальный идентификатор в INSERT?
- Как избежать блокировки таблиц при вставке данных в таблицу
Есть ли решение с использованием SQL-запроса или из мастера задач?
Заранее спасибо…
- Объединение двух значений в Insert - SQL
- Символы для использования при \ r \ n при вставке в SQL Server
- Вставка символа в начале строки в SQL
- SQL Server: строки не соответствуют порядку
- Справка по вводу запроса SQL Server
- Microsoft Sql Management Studio, агент SQL Server, создайте вложенный массив с динамическими параметрами
- SQL Server генерирует уникальное значение
- Создание операторов вставки с ограничениями внешнего ключа
Создайте новый вид, в котором вы выбираете нужные строки из таблицы Employee, например SELECT TOP 21000...
Затем просто создайте сценарий «Просмотр» вместо «Таблица».
В случае, если представления не являются для вас вариантом, я написал следующий код, основанный на ответе Аарона Бертранда, который даст инструкцию insert для одной записи в db.
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