Инструмент для экспорта набора результатов из SQL для вставки операторов? - PullRequest
16 голосов
/ 15 июня 2009

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

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

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

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

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

Ответы [ 9 ]

13 голосов
/ 15 июня 2009

Лично я просто написал бы выбор по таблице и сам сгенерировал вставки Кусок торта.

Например:

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 ...

Пара подводных камней:

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

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

4 голосов
/ 27 сентября 2016

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

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

Для длинных полей Я рекомендую использовать [Сохранить результат как ..] в таблице результатов вместо Копировать . Потому что вы можете получить вырезанный сценарий.

/*
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
3 голосов
/ 09 апреля 2015

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

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

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

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

Выберите способ вывода сценария. Select how you want your script outputted. (I like the
Мне нравится опция "новое окно запроса".

Нажмите кнопку Дополнительно и выберите Только данные для Типы данных для сценария Hit the Advanced button and select
Возможно, вы захотите просмотреть варианты, чтобы увидеть, есть ли что-то еще, что вы хотите изменить. Нажмите OK, когда закончите.

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

2 голосов
/ 16 июня 2009

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

Написать запрос SQL, выполнить его для проверки. Затем выделите его и выберите «Сценарий / оператор вставки» (не помню точную формулировку).

2 голосов
/ 15 июня 2009

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

INSERT INTO tbl (a, b) ВЫБЕРИТЕ c, d ОТ tbl2 ГДЕ c IN (...)

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

1 голос
/ 16 июня 2009

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

1 голос
/ 16 июня 2009

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

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

0 голосов
/ 16 июня 2009

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

Внизу файла, который добавляет хостинговая компания, есть какой-то мусор, просто удалите его. Для запуска просто измените значение @Source_Table на вашу таблицу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...