Инструмент для экспорта набора результатов из SQL для вставки утверждений?

Я хотел бы экспортировать специальные выборки результатов запроса SQL Server для экспорта непосредственно в качестве вложений.

Мне бы очень хотелось увидеть параметр "Сохранить как" "Вставить.." вместе с другими текущими доступными параметрами (csv, txt), когда вы щелкните правой кнопкой мыши в SSMS. Я не экспортирую из существующей физической таблицы, и у меня нет прав на создание новых таблиц, поэтому параметры для script физических таблиц для меня не являются параметрами.

Я должен script либо из временных таблиц, либо из набора результатов в окне запроса.

Сейчас я могу экспортировать в csv, а затем импортировать этот файл в другую таблицу, но это время для многократной работы.

Инструмент должен создавать правильные вставки и понимать типы данных, когда он создает значения для значений NULL.

Ответы

Ответ 1

взгляните на SSMS Tools Pack для SSMS, который позволяет вам делать то, что вам нужно.

Ответ 2

Лично я просто напишу select против таблицы и сам создам вставки. Кусок торта.

Например:

SELECT  'insert into [pubs].[dbo].[authors](
                    [au_id], 
                    [au_lname], 
                    [au_fname], 
                    [phone], 
                    [address], 
                    [city], 
                    [state], 
                    [zip], 
                    [contract])
    values( ''' + 
    [au_id] + ''', ''' + 
    [au_lname] + ''', ''' +
    [au_fname] + ''', ''' +
    [phone] + ''', ''' +
    [address] + ''', ''' +
    [city] + ''', ''' +
    [state] + ''', ''' +
    [zip] + ''', ' +
    cast([contract] as nvarchar) + ');'
FROM    [pubs].[dbo].[authors]

создаст

insert into [pubs].[dbo].[authors](
                    [au_id], 
                    [au_lname], 
                    [au_fname], 
                    [phone], 
                    [address], 
                    [city], 
                    [state], 
                    [zip], 
                    [contract])
    values( '172-32-1176', 'White', 'Johnson', '408 496-7223', '10932 Bigge Rd.', 'Menlo Park', 'CA', '94025', 1);
insert into [pubs].[dbo].[authors](
                    [au_id], 
                    [au_lname], 
                    [au_fname], 
                    [phone], 
                    [address], 
                    [city], 
                    [state], 
                    [zip], 
                    [contract])
    values( '213-46-8915', 'Green', 'Marjorie', '415 986-7020', '309 63rd St. #411', 'Oakland', 'CA', '94618', 1);
... etc ...

Пара ловушек:

  • Не забудьте обернуть свой сингл Котировки
  • Это предполагает чистую базу данных и не является безопасным для SQL-инъекций.

Ответ 3

ВНИМАНИЕ!!! КАК ЕСТЬ. В начале script вы можете увидеть пример использования процедуры. Конечно, вы можете сделать эксплоир INSERT, если вам нужно или добавить DataTypes для требуемого преобразования.

Результатом script является выражение SELECT expresions с UNION ALL. Будьте осторожны с сортировкой базы данных. Я не тестировал другую сортировку больше, чем мне нужно.

Для длинной длины полей рекомендую использовать [Сохранить результат как..] в сетке результатов вместо копирования. Bacause вы можете получить cutted script.

/*
USE AdventureWorks2012
GO

IF OBJECT_ID('tempdb..#PersonTbl') IS NOT NULL
    DROP TABLE #PersonTbl;
GO

SELECT TOP (100)
        BusinessEntityID
      , PersonType
      , NameStyle
      , Title
      , FirstName
      , MiddleName
      , LastName
      , Suffix
      , EmailPromotion
      , CONVERT(NVARCHAR(MAX), AdditionalContactInfo) AS [AdditionalContactInfo]
      , CONVERT(NVARCHAR(MAX), Demographics) AS [Demographics]
      , rowguid
      , ModifiedDate
INTO    #PersonTbl
FROM    Person.Person

 EXEC dbo.p_GetTableAsSqlText
    @table_name = N'#PersonTbl'

EXEC dbo.p_GetTableAsSqlText
    @table_name = N'Person'
    , @table_owner = N'Person'
*/
/*********************************************************************************************/
IF OBJECT_ID('dbo.p_GetTableAsSqlText', 'P') IS NOT NULL
    DROP PROCEDURE dbo.p_GetTableAsSqlText
GO

CREATE PROCEDURE [dbo].[p_GetTableAsSqlText]
    @table_name NVARCHAR(384) /*= 'Person'|'#Person'*/
  , @database_name NVARCHAR(384) = NULL /*= 'AdventureWorks2012'*/
  , @table_owner NVARCHAR(384) = NULL /*= 'Person'|'dbo'*/
 /*WITH ENCRYPTION, RECOMPILE, EXECUTE AS CALLER|SELF|OWNER| 'user_name'*/
AS /*OLEKSANDR PAVLENKO p_GetTableAsSqlText ver.2016.10.11.1*/
    DECLARE @isTemporaryTable BIT = 0

/*[DATABASE NAME]*/
    IF (PATINDEX('#%', @table_name) <> 0)
        BEGIN
            SELECT  @database_name = DB_NAME(2) /*2 - 'tempdb'*/
                  , @isTemporaryTable = 1
        END
    ELSE
        SET @database_name = COALESCE(@database_name, DB_NAME())
/*END [DATABASE NAME]*/

/*[SCHEMA]*/
    SET @table_owner = COALESCE(@table_owner, SCHEMA_NAME())

    DECLARE @database_nameQuoted NVARCHAR(384) = QUOTENAME(@database_name, '')
    DECLARE @table_ownerQuoted NVARCHAR(384) = QUOTENAME(@table_owner, '')
    DECLARE @table_nameQuoted NVARCHAR(384) = QUOTENAME(@table_name, '')

    DECLARE @full_table_name NVARCHAR(769)
 /*384 + 1 + 384*/
    DECLARE @table_id INT

    SET @full_table_name = CONCAT(@database_nameQuoted, '.', @table_ownerQuoted, '.', @table_nameQuoted)
    SET @table_id = OBJECT_ID(@full_table_name)

    CREATE TABLE #ColumnTbl
        (
         ColumnId INT
       , ColName sysname COLLATE DATABASE_DEFAULT
       , TypeId TINYINT
       , TypeName sysname COLLATE DATABASE_DEFAULT
       , TypeMaxLength INT
        ) 

    DECLARE @dynSql NVARCHAR(MAX) = CONCAT('
INSERT INTO #ColumnTbl
SELECT  ISC.ORDINAL_POSITION AS [ColumnId]
      , ISC.COLUMN_NAME AS [ColName]
      , T.system_type_id AS [TypeId]
      , ISC.DATA_TYPE AS [TypeName]
      , ISC.CHARACTER_MAXIMUM_LENGTH AS [TypeMaxLength]
FROM    ', @database_name, '.INFORMATION_SCHEMA.COLUMNS AS [ISC]
        INNER JOIN ', @database_name, '.sys.objects AS [O] ON ISC.TABLE_NAME = O.name
        INNER JOIN ', @database_name, '.sys.types AS [T] ON ISC.DATA_TYPE = T.name
WHERE   ISC.TABLE_CATALOG = "', @database_name, '"
        AND ISC.TABLE_SCHEMA = "', @table_owner, '"
        AND O.object_id = ', @table_id)

    IF (@isTemporaryTable = 0)
        SET @dynSql = CONCAT(@dynSql, '
        AND ISC.TABLE_NAME = "', @table_name, '"
')
    ELSE
        SET @dynSql = CONCAT(@dynSql, '
        AND ISC.TABLE_NAME LIKE "', @table_name, '%"
')

    SET @dynSql = REPLACE(@dynSql, '"', '''')
    EXEC(@dynSql)

    DECLARE @columnNamesSeparated NVARCHAR(MAX) = SUBSTRING((SELECT ', [' + C.ColName + ']' AS [text()]
                                                             FROM   #ColumnTbl AS [C]
                                                             ORDER BY C.ColumnId
                                                            FOR
                                                             XML PATH('')
                                                            ), 2, 4000)
    --SELECT  @columnNamesSeparated

    DECLARE @columnNamesSeparatedWithTypes NVARCHAR(MAX) = SUBSTRING((SELECT    '+", " + "CONVERT(' + (CASE C.TypeId
                                                                                                         WHEN 231 /*NVARCHAR*/
                                                                                                         THEN CONCAT(C.TypeName, '(',
                                                                                                                     (CASE WHEN C.TypeMaxLength = -1 THEN 'MAX'
                                                                                                                           ELSE CONVERT(NVARCHAR(MAX), C.TypeMaxLength)
                                                                                                                      END), ')')
                                                                                                         WHEN 239 /*NCHAR*/
                                                                                                         THEN CONCAT(C.TypeName, '(', C.TypeMaxLength, ')') 
                                                                                                      /*WHEN -1 /*XML*/ THEN '(MAX)'*/
                                                                                                         ELSE C.TypeName
                                                                                                       END) + ', "+ COALESCE('
                                                                                + (CASE C.TypeId
                                                                                     WHEN 56 /*INT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
                                                                                     WHEN 40 /*DATE*/
                                                                                     THEN 'N"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 101) + """"'
                                                                                     WHEN 60 /*MONEY*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
                                                                                     WHEN 61 /*DATETIME*/
                                                                                     THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 21) + """"'
                                                                                     WHEN 104 /*BIT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
                                                                                     WHEN 106 /*DECIMAL*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
                                                                                     WHEN 127 /*BIGINT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
                                                                                     WHEN 189 /*TIMESTAMP*/
                                                                                     THEN 'N"""" + CONVERT(NVARCHAR(MAX), SUBSTRING([' + C.ColName
                                                                                          + '], 1, 8000), 1) + """"'
                                                                                     WHEN 241 /*XML*/
                                                                                     THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + ']) + """"'
                                                                                     ELSE 'N"""" + CONVERT(NVARCHAR(MAX), REPLACE([' + C.ColName
                                                                                          + '], """", """""")) + """"'
                                                                                   END) + ' , "NULL") + ") AS [' + C.ColName + ']"' + CHAR(10) COLLATE DATABASE_DEFAULT AS [text()]
                                                                      FROM      #ColumnTbl AS [C]
                                                                      ORDER BY  C.ColumnId
                                                                     FOR
                                                                      XML PATH('')
                                                                     ), 9, 100000)

/*SELECT @columnNamesSeparated, @full_table_name*/
    DECLARE @dynSqlText NVARCHAR(MAX) = CONCAT(N'
SELECT (CASE WHEN ROW_NUMBER() OVER (ORDER BY (SELECT   1 )) = 1 THEN "
-- INSERT INTO ', @full_table_name, '
--      (', @columnNamesSeparated, '
--      )
SELECT T.* --INTO #ResultTbl
FROM (
"
                ELSE "UNION ALL "
                END) + "SELECT "+ ', @columnNamesSeparatedWithTypes, ' FROM ', @full_table_name)
    SET @dynSqlText = CONCAT(@dynSqlText, ' UNION ALL SELECT ") AS [T]

--SELECT *
--FROM #ResultTbl
"')

    SET @dynSqlText = REPLACE(@dynSqlText, '"', '''')
    --SELECT  @dynSqlText AS [XML_F52E2B61-18A1-11d1-B105-00805F49916B]
    EXEC(@dynSqlText)

    IF OBJECT_ID('tempdb..#ColumnTbl') IS NOT NULL
        DROP TABLE #ColumnTbl;
GO

Ответ 4

Это не совсем то, о чем спрашивал OP, но если вы хотите создать insert script для всех записей в таблице, вы можете сделать это в SSMS (по крайней мере, в 2012 году, возможно, в более старых версиях) без каких-либо дополнительных дополнения.

Щелкните правой кнопкой мыши по базе данных, содержащей таблицу (ы), в которой хранятся ваши данные, и нажмите "Задачи" > "Сгенерировать скрипты". Вы попадете к волшебнику, как вы видите ниже.

Просто нажмите "Далее", если отображается этот первый экран. Just hit Next if this first screen is displayed.

Выберите таблицу (таблицы), для которой вы хотите создать script. Select the table(s) for which you would like to generate the script.

Выберите, как вы хотите вывести script. Select how you want your script outputted. (I like the "new query window" option)
Мне нравится опция "новое окно запроса".

Нажмите кнопку "Дополнительно" и выберите "Данные только для типов данных" в script Hit the Advanced button and select "Data only" for "Types of data to script"
Возможно, вы захотите просмотреть варианты, чтобы увидеть, есть ли что-нибудь еще, что вы хотите изменить. Нажмите "ОК", когда закончите.

Нажмите "Далее", пока вы не перейдете на этот экран. Когда все станет зеленым, у вас будет insert script! Hit Next until you get to this screen. Once everything goes green you'll have your script!
Мне нравится оставлять этот экран открытым, пока я тестирую свой script, чтобы увидеть, нужно ли мне делать какие-либо изменения.

Ответ 5

Я знаю, что это не совсем то, что вы ищете, но вы можете сделать вставку из инструкции select:

INSERT INTO tbl (a, b) SELECT c, d FROM tbl2 WHERE c IN (...)

Очевидно, что это довольно грубо, но я надеюсь, что это поможет понять, что я пытаюсь сказать.

Ответ 6

Squirrel SQL также может это сделать.

Записать SQL-запрос, выполнить его для проверки. Затем выделите его и выберите Script/Insert statement (не помните точную формулировку).

Ответ 7

У WinSQL на www.synametrics.com есть эта функция, и это довольно удобно. Не уверен, что эта функция находится в бесплатной версии, но вы все равно получаете версию Professional в течение 30 дней.

Это очень удобный и простой в использовании инструмент запросов для любой базы данных, подключенной к ODBC.

Ответ 8

TOAD может сделать это из меню "Сохранить как" в сетке данных.

Ответ 9

Я написал script для этой проблемы, которая должна работать в любой таблице. (Я говорю "должен", потому что script не проверен на 100% и все еще немного грубо.) Вы можете найти его на http://www.jessemclain.com/downloads/code/sql/spd_Tool_Get_Insert_Into_Values.sql.txt

Там некоторый барахл в нижней части файла, который добавляет хостинговая компания, просто отмените это. Чтобы запустить, просто измените значение @Source_Table на таблицу.

ПРИМЕЧАНИЕ. Текстовый файл, который я разместил, выглядит нормально в Firefox 3.0.11, но не в IE7.