Создать вставку script для выбранных записей?
У меня есть таблица со следующими данными:
Pk_Id ProductName Fk_CompanyId Price
------------------------------------------------------
1 AMX 1 10.00
2 ABC 1 11.00
3 APEX 1 12.00
4 AMX 1 10.00
5 ABC 1 11.00
6 APEX 1 12.00
7 AMX 2 10.00
8 ABC 2 11.00
9 APEX 2 12.00
Я хочу создать Insert script для переноса записей, Fk_CompanyId которых равен 1.
Существует опция insert script для генерации script для всех записей, но я хочу, чтобы некоторые записи были перенесены для переноса в другую базу данных.
Ответы
Ответ 1
Если вы используете SQL Management Studio, вы можете щелкнуть правой кнопкой мыши по имени своей базы данных и выбрать
Задачи > Импорт/экспорт данных и последующие действия мастера.
один из шагов называется "Укажите копию таблицы или запрос", где есть возможность написать запрос, чтобы указать данные для передачи, поэтому вы можете просто указать следующий запрос:
select * from [Table] where Fk_CompanyId = 1
Ответ 2
SELECT 'INSERT SomeOtherDB.dbo.table(column1,column2,etc.)
SELECT ' + CONVERT(VARCHAR(12), Pk_Id) + ','
+ '''' + REPLACE(ProductName, '''', '''''') + ''','
+ CONVERT(VARCHAR(12), Fk_CompanyId) + ','
+ CONVERT(VARCHAR(12), Price) + ';'
FROM dbo.unspecified_table_name
WHERE Fk_CompanyId = 1;
Ответ 3
CREATE PROCEDURE sp_generate_insertscripts
(
@TABLENAME VARCHAR(MAX),
@FILTER_CONDITION VARCHAR(MAX)='' -- where TableId = 5 or some value
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @TABLE_NAME VARCHAR(MAX),
@CSV_COLUMN VARCHAR(MAX),
@QUOTED_DATA VARCHAR(MAX),
@TEXT VARCHAR(MAX),
@FILTER VARCHAR(MAX)
SET @[email protected]
SELECT @[email protected]_CONDITION
SELECT @CSV_COLUMN=STUFF
(
(
SELECT ',['+ NAME +']' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @QUOTED_DATA=STUFF
(
(
SELECT ' ISNULL(QUOTENAME('+NAME+','+QUOTENAME('''','''''')+'),'+'''NULL'''+')+'','''+'+' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @TEXT='SELECT ''INSERT INTO '[email protected]_NAME+'('[email protected]_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '[email protected]_NAME + @FILTER
--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT
EXECUTE (@TEXT)
SET NOCOUNT OFF
END
Ответ 4
Вы можете создать представление с вашими критериями и затем экспортировать представление?
Ответ 5
Если возможно, используйте Visual Studio. Инструменты данных Microsoft SQL Server (SSDT) предоставляют встроенную функциональность для этого начиная с выпуска в марте 2014 года:
- Откройте Visual Studio
- Откройте "Вид" → "Обозреватель объектов SQL Server"
- Добавить соединение на ваш сервер
- Разверните соответствующую базу данных
- Разверните папку "Таблицы"
- Щелкните правой кнопкой мыши по соответствующей таблице
- Выберите "Просмотр данных" из контекстного меню
- В новом окне для просмотра данных используйте функцию "Сортировка и набор данных фильтра" на панели инструментов, чтобы применить фильтр. Обратите внимание, что эта функциональность ограничена, и вы не можете писать SQL-запросы explizit.
- После того, как вы применили свой фильтр и видите только те данные, которые вам нужны, нажмите "Сценарий" или "Сценарий в файл" на панели инструментов.
- Вуаля - Здесь у вас есть скрипт вставки для ваших отфильтрованных данных
Примечание: будьте осторожны, окно "Просмотр данных" похоже на SSMS "Edit Top 200 Rows" - вы можете редактировать данные сразу
(Тестирование в Visual Studio 2015 с инструментами данных Microsoft SQL Server (SSDT) версии 14.0.60812.0 и Microsoft SQL Server 2012)
Ответ 6
В SSMS выполните ваш SQL-запрос. В окне результатов выберите все ячейки и скопируйте значения. Перейти к ниже веб-сайта и там вы можете вставлять скопированные данные и генерировать SQL-скрипты. Вы также можете сохранить результаты запроса из SSMS в виде файла CSV и импортировать файл csv в этот веб-сайт.
http://www.convertcsv.com/csv-to-sql.htm
Ответ 7
Если вы используете Oracle SQL Developer, это будет
select /*insert*/ * from TABLE_NAME where COLUMN_NAME = 'VALUE';
Запустите это как script
Ответ 8
В итоге я сделал это за 2 шага. Выбрали записи, которые я хочу в новую таблицу в базе данных, а затем сгенерировали только данные SQL script в SSMS. Я нашел и заменил на сгенерированном script и удалил таблицу.
Ответ 9
- CREATE DATABASE Test
- выберите INTO Test.dbo. [Таблица] из [Таблица], где Fk_CompanyId = 1
- Щелкните правой кнопкой мыши на Test db и сгенерируйте script
Ответ 10
Я создал следующий procedure
:
if object_id('tool.create_insert', 'P') is null
begin
exec('create procedure tool.create_insert as');
end;
go
alter procedure tool.create_insert(@schema varchar(200) = 'dbo',
@table varchar(200),
@where varchar(max) = null,
@top int = null,
@insert varchar(max) output)
as
begin
declare @insert_fields varchar(max),
@select varchar(max),
@error varchar(500),
@query varchar(max);
declare @values table(description varchar(max));
set nocount on;
-- Get columns
select @insert_fields = isnull(@insert_fields + ', ', '') + c.name,
@select = case type_name(c.system_type_id)
when 'varchar' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + cast(' + c.name + ' as varchar) + '''''''', ''null'')'
when 'datetime' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + convert(varchar, ' + c.name + ', 121) + '''''''', ''null'')'
else isnull(@select + ' + '', '' + ', '') + 'isnull(cast(' + c.name + ' as varchar), ''null'')'
end
from sys.columns c with(nolock)
inner join sys.tables t with(nolock) on t.object_id = c.object_id
inner join sys.schemas s with(nolock) on s.schema_id = t.schema_id
where s.name = @schema
and t.name = @table;
-- If there no columns...
if @insert_fields is null or @select is null
begin
set @error = 'There' no ' + @schema + '.' + @table + ' inside the target database.';
raiserror(@error, 16, 1);
return;
end;
set @insert_fields = 'insert into ' + @schema + '.' + @table + '(' + @insert_fields + ')';
if isnull(@where, '') <> '' and charindex('where', ltrim(rtrim(@where))) < 1
begin
set @where = 'where ' + @where;
end
else
begin
set @where = '';
end;
set @query = 'select ' + isnull('top(' + cast(@top as varchar) + ')', '') + @select + ' from ' + @schema + '.' + @table + ' with (nolock) ' + @where;
insert into @values(description)
exec(@query);
set @insert = isnull(@insert + char(10), '') + '--' + upper(@schema + '.' + @table);
select @insert = @insert + char(10) + @insert_fields + char(10) + 'values(' + v.description + ');' + char(10) + 'go' + char(10)
from @values v
where isnull(v.description, '') <> '';
end;
go
Затем вы можете использовать его таким образом:
declare @insert varchar(max),
@part varchar(max),
@start int,
@end int;
set @start = 1;
exec tool.create_insert @schema = 'dbo',
@table = 'myTable',
@where = 'Fk_CompanyId = 1',
@insert = @insert output;
-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
set @end = charindex(char(10), @insert);
if @end = 0
begin
set @end = len(@insert) + 1;
end;
print substring(@insert, @start, @end - 1);
set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;
Результат будет примерно таким:
--DBO.MYTABLE
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(1, 'AMX', 1, 10.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(2, 'ABC', 1, 11.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(3, 'APEX', 1, 12.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(4, 'AMX', 1, 10.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(5, 'ABC', 1, 11.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(6, 'APEX', 1, 12.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(7, 'AMX', 2, 10.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(8, 'ABC', 2, 11.00);
go
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(9, 'APEX', 2, 12.00);
go
Если вы просто хотите получить ряд строк, используйте параметр @top
, как показано ниже:
declare @insert varchar(max),
@part varchar(max),
@start int,
@end int;
set @start = 1;
exec tool.create_insert @schema = 'dbo',
@table = 'myTable',
@top = 100,
@insert = @insert output;
-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
set @end = charindex(char(10), @insert);
if @end = 0
begin
set @end = len(@insert) + 1;
end;
print substring(@insert, @start, @end - 1);
set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;