Подтвердить что ты не робот

Преобразование Выберите результаты в Insert script

У меня есть SQL Server 2008, SQL Server Management Studio.

Мне нужно выбрать данные из таблицы 1 в базе данных1. Затем мне нужно отредактировать некоторые значения в результатах и ​​вставить значения в таблицу1 в database2.

Или позвольте мне сказать иначе. Как преобразовать данные в одну таблицу в insert script.

4b9b3361

Ответ 1

SSMS Toolpack ( БЕСПЛАТНО, как в пиве) обладает множеством отличных функций - в том числе генерирует инструкции INSERT из таблиц.

Обновление: для SQL Server Management Studio 2012 (и новее), SSMS Toolpack больше не является бесплатным, но требует скромной платы за лицензирование.

Ответ 2

Вот еще один способ, который может быть проще, чем установка плагинов или внешних инструментов в следующих ситуациях:

  • Сделайте select [whatever you need] INTO temp.table_name from [... etc ...].
  • Щелкните правой кнопкой мыши по базе данных в Проводнике объектов = > Задачи = > Сгенерировать скрипты
  • Выберите temp.table_name на экране "Выбрать объекты", нажмите "Далее".
  • В окне "Укажите, как скрипты должны быть сохранены":
    • Нажмите "Дополнительно", найдите свойство "Типы данных в Script", выберите "Только данные", закройте расширенные свойства.
    • Выберите "Сохранить в новом окне запроса" (если у вас нет тысяч записей).
  • Нажмите "Далее", дождитесь завершения задания, обратите внимание, что в появившемся окне запроса появятся результирующие операторы INSERT.
  • Используйте "Найти и заменить", чтобы изменить все [temp.table_name] на [your_table_name].
  • drop table [temp.table_name].

Ответ 3

Нативный метод:

например, если у вас есть таблица

Users(Id, name)

Вы можете сделать это:

select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users

Ответ 4

В SSMS:

  • Щелкните правой кнопкой мыши по базе данных > Задачи > Сгенерировать скрипты

  • Далее

  • Выберите "Выбрать конкретные объекты базы данных" и проверьте таблицу, которую вы хотите записать в сценарий, Далее

  • Нажмите Advanced > в списке параметров, прокрутите страницу вниз и найдите "Типы данных до script" и измените его на "Только данные" > OK

  • Выберите "Сохранить в новом окне запроса" > Далее > Далее > Готово

Все 180 строк теперь написаны как 180 вставных операторов!

Ответ 5

Используя визуальную студию, сделайте следующее

Создайте проект типа SQL Server → Проект базы данных SQL Server

откройте проводник sql-сервера CTL- \, CTL-S

добавьте SQL Server, щелкнув правой кнопкой мыши по значку SQL SERVER. Selcet ADD NEW SERVER

перейти к таблице, в которой вы заинтересованы

щелкните правой кнопкой мыши → ПРОСМОТР ДАННЫХ

Нажмите верхнюю левую ячейку, чтобы выделить все (ctl-A, похоже, не работает)

Щелкните правой кнопкой мыши → SCript

Это потрясающе. Я пробовал все перечисленные выше на протяжении многих лет. Я знаю, что есть инструмент, который будет делать это и многое другое, не может думать о его названии. Но это очень дорого.

Удачи. Я просто понял это. Не тестировали его широко с текстовыми полями и т.д., Но похоже, что вам предстоит пройти долгий путь по дороге.

Грег

Ответ 6

Это можно сделать с помощью Visual Studio Обозревателя объектов SQL Server.

Вы можете нажать "Просмотреть данные" в контекстном меню для необходимой таблицы, фильтровать результаты и сохранить результат как script.

Ответ 7

Вы можете выбрать параметр "Результат для файла" в SSMS и экспортировать результат выбора в файл и внести изменения в файл результатов и, наконец, использовать копию BCP-Bulk, которую вы можете вставить в таблицу 1 в базе данных 2.

Я думаю, что для массовой вставки вам нужно преобразовать .rpt файл в CSV файл.

Надеюсь, это поможет.

Ответ 8

1- Объяснение скриптов

A) Синтаксис для вставки данных в таблицу приведен ниже

Insert into table(col1,col2,col3,col4,col5)    

             -- To achieve this part i    
             --have used below variable
                [email protected]_COLUMN-------

values(Col1 data in quote, Col2..quote,..Col5..quote)

-- To achieve this part 
-- i.e column data in 
--quote i have used 
--below variable
[email protected]_DATA---

C) Чтобы получить данные из существующих таблице мы должны написать выбор запрос таким образом, чтобы выход будет в форме как указано выше скриптов

D) Тогда, наконец, у меня есть Concatenated над переменной для создания окончательный script, который будет генерировать вставку script при выполнении

E) @TEXT = 'SELECT' 'INSERT INTO  '+ @TABLE_NAME +' ( '+ @CSV_COLUMN +) ЗНАЧЕНИЯ ( '' '+' + '+ подстроку (@QUOTED_DATA, 1, LEN (@QUOTED_DATA) -5) +' + '+' '') ''' + 'Insert_Scripts FROM' + @TABLE_NAME + @FILTER_CONDITION

F) И, наконец, выполнил указанный выше запрос EXECUTE (TEXT)

G) Функция QUOTENAME() используется для обертывания данные столбца внутри цитаты

H) ISNULL используется, потому что если какая-либо строка имеет NULL данных для любого столбца, запрос которого не выполняется и вернуть NULL, чтобы избежать что я использовал ISNULL

I) И создал sp sp_generate_insertscripts для тех же

1- Просто поместите имя таблицы, для которой вы хотите вставить script

2- Состояние фильтра, если вы хотите получить конкретные результаты

----------Final Procedure To generate Script------

CREATE PROCEDURE sp_generate_insertscripts
(
    @TABLE_NAME VARCHAR(MAX),
    @FILTER_CONDITION VARCHAR(MAX)=''
)
AS
BEGIN

SET NOCOUNT ON

DECLARE @CSV_COLUMN VARCHAR(MAX),
        @QUOTED_DATA VARCHAR(MAX),
        @TEXT VARCHAR(MAX)

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_CONDITION

--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT

EXECUTE (@TEXT)

SET NOCOUNT OFF

END

Ответ 9

Вы можете использовать Sql Server Integration Service Packages, специально предназначенный для Импорт и экспорт.

У VS есть пакет для разработки этих пакетов, если вы полностью установите Sql Server.

Услуги интеграции в Business Intelligence Development Studio

Ответ 10

Я думаю, что это также возможно с adhoc-запросами вы можете экспортировать результат в файл excel, а затем импортировать этот файл в свой datatable объект или использовать его как есть, а затем импортировать файл excel во вторую базу данных взгляните на эту ссылку это может помочь u alot.

http://vscontrols.blogspot.com/2010/09/import-and-export-excel-to-sql-server.html

Ответ 11

Создайте отдельную таблицу, используя инструкцию Например

Выберите * в Test_123 из [dbo]. [Сотрудник], где Name like "% Test%"

Перейдите в базу данных Щелкните правой кнопкой мыши базу данных Нажмите "Создать" Script Выберите таблицу Выберите опцию advanace и выберите атрибут "Только данные", Выберите файл "открыть в новом запросе"

Sql будет генерировать script для вас

Ответ 12

Если вы используете Oracle (или настраиваете приложение на SQL Server), то Oracle SQL Developer делает это за вас. выберите "выгрузить" для таблицы и следуйте опциям через (отменить DDL, если вы не хотите, чтобы вся таблица создавала материал).

Ответ 13

Я нашел этот SMSMS Boost, который является бесплатным и делает именно это между прочим. Вы можете щелкнуть правой кнопкой мыши по результатам и выбрать Script данные как.

Ответ 14

Вы можете использовать оператор INTO INSERT SELECT, чтобы вставлять результаты запроса select в таблицу. http://www.w3schools.com/sql/sql_insert_into_select.asp

Пример:

INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';

Ответ 15

Вы можете использовать этот Q2C.SSMSPlugin, который является бесплатным и открытым исходным кодом. Вы можете щелкнуть правой кнопкой мыши и выбрать "Выполнять запрос в команду... → Запрос для вставки...". Наслаждайтесь)

Ответ 16

У меня была аналогичная проблема, но мне нужно было создать инструкцию INSERT из запроса (с фильтрами и т.д.)

Итак, я создал следующую процедуру:

CREATE PROCEDURE dbo.ConvertQueryToInsert (@input NVARCHAR(max), @target NVARCHAR(max)) AS BEGIN

    DECLARE @fields NVARCHAR(max);
    DECLARE @select NVARCHAR(max);

    -- Get the defintion from sys.columns and assemble a string with the fields/transformations for the dynamic query
    SELECT
        @fields = COALESCE(@fields + ', ', '') + '[' + name +']', 
        @select = COALESCE(@select + ', ', '') + ''''''' + ISNULL(CAST([' + name + '] AS NVARCHAR(max)), ''NULL'')+'''''''
    FROM tempdb.sys.columns 
    WHERE [object_id] = OBJECT_ID(N'tempdb..'[email protected]);

    -- Run the a dynamic query with the fields from @select into a new temp table
    CREATE TABLE #ConvertQueryToInsertTemp (strings nvarchar(max))
    DECLARE @stmt NVARCHAR(max) = 'INSERT INTO #ConvertQueryToInsertTemp SELECT '''+ @select + ''' AS [strings] FROM '[email protected]
    exec sp_executesql @stmt

    -- Output the final insert statement 
    SELECT 'INSERT INTO ' + @target + ' (' + @fields + ') VALUES (' + REPLACE(strings, '''NULL''', 'NULL') +')' FROM #ConvertQueryToInsertTemp

    -- Clean up temp tables
    DROP TABLE #ConvertQueryToInsertTemp
    SET @stmt = 'DROP TABLE ' + @input
    exec sp_executesql @stmt
END

Затем вы можете использовать его, записав вывод своего запроса в временную таблицу и выполнив процедуру:

-- Example table
CREATE TABLE Dummy (Id INT, Comment NVARCHAR(50), TimeStamp DATETIME)
INSERT INTO Dummy VALUES (1 , 'Foo', GetDate()), (2, 'Bar', GetDate()), (3, 'Foo Bar', GetDate())

-- Run query and procedure
SELECT * INTO #TempTableForConvert FROM Dummy WHERE Id < 3
EXEC dbo.ConvertQueryToInsert '#TempTableForConvert', 'dbo.Dummy'

Примечание: Эта процедура только передает значения в строку, которая может привести к тому, что данные выглядят несколько иначе. С DATETIME, например, секунды будут потеряны.

Ответ 17

Это более универсальное решение (которое может сделать немного больше, чем задает вопрос) и может использоваться в окне запроса без необходимости создания нового хранимого proc - полезного в производственных базах данных, например, если вы не используете имеют доступ на запись.

Чтобы использовать код, пожалуйста, измените его в соответствии с комментариями в строке, которые объясняют его использование. Затем вы можете запустить этот запрос в окне запроса и распечатать необходимые инструкции INSERT.

SET NOCOUNT ON

-- Set the ID you wish to filter on here
DECLARE @id AS INT = 123

DECLARE @tables TABLE (Name NVARCHAR(128), IdField NVARCHAR(128), IdInsert BIT, Excluded NVARCHAR(128))

-- Add any tables you wish to generate INSERT statements for here. The fields are as thus:
 -- Name: Your table name
 -- IdField: The field on which to filter the dataset
 -- IdInsert: If the primary key field is to be included in the INSERT statement
 -- Excluded: Any fields you do not wish to include in the INSERT statement
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable1', 'Id', 0, 'Created,Modified')
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable2', 'Id', 1, 'Created,Modified')

DECLARE @numberTypes TABLE (sysId TINYINT)

-- This will ensure INT and BIT types are not surrounded with quotes in the
-- resultant INSERT statement, but you may need to add more (from sys.types)
INSERT @numberTypes(SysId) VALUES(56),(104)

DECLARE @rows INT = (SELECT COUNT(*) FROM @tables)
DECLARE @cnt INT = 1

DECLARE @results TABLE (Sql NVARCHAR(4000))

WHILE @cnt <= @rows
BEGIN
    DECLARE @tablename AS NVARCHAR(128)
    DECLARE @idField AS NVARCHAR(128)
    DECLARE @idInsert AS BIT
    DECLARE @excluded AS NVARCHAR(128)
    SELECT
        @tablename = Name,
        @idField = IdField,
        @idInsert = IdInsert,
        @excluded = Excluded
    FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowId FROM @tables) t WHERE t.RowId = @cnt

    DECLARE @excludedFields TABLE (FieldName NVARCHAR(128))
    DECLARE @xml AS XML = CAST(('<X>' + REPLACE(@excluded, ',', '</X><X>') + '</X>') AS XML)
    INSERT INTO @excludedFields SELECT N.value('.', 'NVARCHAR(128)') FROM @xml.nodes('X') AS T(N)

    DECLARE @setIdentity NVARCHAR(128) = 'SET IDENTITY_INSERT ' + @tablename

    DECLARE @execsql AS NVARCHAR(4000) = 'SELECT ''' + CASE WHEN @idInsert = 1 THEN @setIdentity + ' ON' + CHAR(13) ELSE '' END + 'INSERT INTO ' + @tablename + ' ('
    SELECT @execsql = @execsql +
    STUFF
    (
        (
            SELECT CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN ', ' + name ELSE '' END
            FROM sys.columns
            WHERE object_id = OBJECT_ID('dbo.' + @tablename)
            FOR XML PATH('')
        ), 1, 2, ''
    ) +
    ')' + CHAR(13) + 'VALUES (' +
    STUFF
    (
        (
            SELECT
                CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN
                    ''', '' + ISNULL(' +
                    CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ''''''''' + ' END +
                    'CAST(' + name + ' AS VARCHAR)' +
                    CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ' + ''''''''' END +
                    ', ''NULL'') + '
                ELSE ''
                END
            FROM sys.columns
            WHERE object_id = OBJECT_ID('dbo.' + @tablename)
            FOR XML PATH('')
        ), 1, 3, ''
    ) +
    ''')' + CASE WHEN @idInsert = 1 THEN CHAR(13) + @setIdentity + ' OFF' ELSE '' END +
    ''' FROM ' + @tablename + ' WHERE ' + @idField + ' = ' + CAST(@id AS VARCHAR)

    INSERT @results EXEC (@execsql)
    DELETE @excludedFields
    SET @cnt = @cnt + 1
END

DECLARE cur CURSOR FOR SELECT Sql FROM @results
OPEN cur

DECLARE @sql NVARCHAR(4000)
FETCH NEXT FROM cur INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @sql
    FETCH NEXT FROM cur INTO @sql
END

CLOSE cur
DEALLOCATE cur

Ответ 18

Я создал следующий 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 = 'customer',
                        @where  = 'id = 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.CUSTOMER
insert into dbo.customer(id, name, type)
values(1, 'CUSTOMER NAME', 'F');
go

Если вы просто хотите получить ряд строк, используйте параметр @top, как показано ниже:

declare @insert varchar(max),
        @part   varchar(max),
        @start  int,
        @end    int;

set @start = 1;

exec tool.create_insert @schema = 'dbo',
                        @table = 'customer',
                        @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;