Каков наилучший способ автоматически создавать операторы INSERT для таблицы SQL Server?

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

Время от времени мы хотим «обновить» соответствующие таблицы, что означает их удаление, повторное создание и запуск сохраненного запроса на добавление MS Access.

Первая часть (удаление и повторное создание) представляет собой простой сценарий SQL, но последняя часть заставляет меня съеживаться. Я хочу один сценарий установки, который имеет набор вставок для регенерации фиктивных данных.

У меня есть данные в таблицах сейчас. Каков наилучший способ автоматически создать большой список операторов INSERT из этого набора данных?

Единственный способ сделать это - сохранить таблицу в таблице Excel, а затем написать формулу Excel, чтобы создать INSERT для каждой строки, что, безусловно, не лучший способ.

Я использую Management Studio 2008 для подключения к базе данных SQL Server 2005.

11.06.2009 17:42:28
Вау, я только что проверил свою установку, и, вы правы, «таблица сценариев» -> «ВСТАВКА» дает только шаблон вставки, а не страницу вставок с вашими фактическими данными! Я надеюсь, что на ваш вопрос ответят, потому что я бы хотел, чтобы вам было проще.
JoeCool 11.06.2009 17:46:52
@JosephStyons Я немного обновил вопрос в попытке существенно упростить и уточнить его, и сохранить его актуальность. Это стало основным вопросом в StackOverflow, и было бы неплохо снизить нагрузку на людей, которые приходят сюда за решением. =) Посмотрите, найдете ли вы какую-либо удаленную информацию важной. Если у вас есть какие-либо возражения по поводу редактирования, не стесняйтесь откатить его назад.
Evan Carroll 21.07.2018 20:11:43
@EvanCarroll Спасибо, Эван. Я сделал это обратно; Я с уважением предполагаю, что некоторая справочная информация полезна не только для контекста, но и для того, чтобы помочь вопросу придумать реальные условия поиска. Я сохранил одно из ваших изменений; Я пропустил параграф, касающийся жабы для Oracle. Это, вероятно, не очень полезно.
JosephStyons 22.07.2018 21:45:30
Я использую SSMSBoost. ssmsboost.com
Darren Griffith 3.09.2019 21:31:37
21 ОТВЕТ
РЕШЕНИЕ

Microsoft должна объявить об этой функции SSMS 2008. Функция, которую вы ищете, встроена в утилиту Generate Script , но эта функция отключена по умолчанию и должна быть включена при создании сценариев таблицы.

Это быстрый способ создания INSERTоператоров для всех данных в вашей таблице без использования сценариев или надстроек в SQL Management Studio 2008:

  1. Щелкните правой кнопкой мыши базу данных и перейдите к Задачам > Создать сценарии .
  2. Выберите таблицы (или объекты), для которых вы хотите сгенерировать скрипт.
  3. Перейдите на вкладку « Настройка параметров сценариев » и нажмите кнопку « Дополнительно» .
  4. В категории « Общие » перейдите к « Тип данных для сценария».
  5. Есть 3 варианта: схемы только , только данные и схемы и данных . Выберите соответствующую опцию и нажмите ОК . SqlDataOptions

Затем вы получите CREATE TABLEвыписку и все INSERTвыписки для данных прямо из SSMS.

1012
30.08.2019 07:52:27
Обязательно прочитайте комментарий Noonand ниже - флажок не находится под SCRIPT DATA = TRUE, вместо этого он находится под общим разделом, выберите соответствующий параметр для «Типы данных для сценария».
Richard West 21.05.2011 21:09:45
Если вы хотите создать только один оператор вставки, сделайте что-то вроде этого; выберите * в newtable из существующих таблиц где [ваше предложение where], а затем просто выполните описанные выше действия для новой таблицы
tony 22.06.2013 10:24:37
Кнопка «Дополнительно» находится в очень тупом месте. Неудивительно, что никто никогда не находит это самостоятельно. Кажется, что это идет с опцией «Сохранить в файл». Кроме того, мне интересно, почему он не генерирует более эффективный оператор вставки вместо множества множественных операторов вставки
Joe Phillips 17.08.2015 19:30:44
Это работает так же, как в новых версиях. Подтвердил это в SSMS 2014.
Alan Fluka 7.09.2015 10:10:49
К вашему сведению, если вы выбрали Data onlyи обнаружили Cyclic dependencies foundошибку, переключитесь на, Schema and dataчтобы избежать ошибки. Бывает в Management Studio v17.
Endy Tjahjono 6.09.2017 10:50:44

почему бы просто не сделать резервную копию данных перед началом работы с ними, а затем восстановить, когда вы хотите, чтобы они были обновлены?

если вам нужно сгенерировать вставки, попробуйте: http://vyaskn.tripod.com/code.htm#inserts

0
11.06.2009 17:44:14
Я хотел бы гибкость, чтобы редактировать данные в INSERT, если я хочу. Кроме этого, нет никакой реальной причины ... Мне нужно исследовать синтаксис RESTORE и BACKUP, чтобы я мог сделать это из скрипта.
JosephStyons 11.06.2009 17:46:22

Мы используем эту хранимую процедуру - она ​​позволяет вам ориентироваться на конкретные таблицы и использовать предложения where. Вы можете найти текст здесь .

Например, это позволяет вам сделать это:

EXEC sp_generate_inserts 'titles'

Исходный код скопирован по ссылке:

SET NOCOUNT ON
GO

PRINT 'Using Master database'
USE master
GO

PRINT 'Checking for the existence of this procedure'
IF (SELECT OBJECT_ID('sp_generate_inserts','P')) IS NOT NULL --means, the procedure already exists
    BEGIN
        PRINT 'Procedure already exists. So, dropping it'
        DROP PROC sp_generate_inserts
    END
GO

--Turn system object marking on
EXEC master.dbo.sp_MS_upd_sysobj_category 1
GO

CREATE PROC sp_generate_inserts
(
    @table_name varchar(776),       -- The table/view for which the INSERT statements will be generated using the existing data
    @target_table varchar(776) = NULL,  -- Use this parameter to specify a different table name into which the data will be inserted
    @include_column_list bit = 1,       -- Use this parameter to include/ommit column list in the generated INSERT statement
    @from varchar(800) = NULL,      -- Use this parameter to filter the rows based on a filter condition (using WHERE)
    @include_timestamp bit = 0,         -- Specify 1 for this parameter, if you want to include the TIMESTAMP/ROWVERSION column's data in the INSERT statement
    @debug_mode bit = 0,            -- If @debug_mode is set to 1, the SQL statements constructed by this procedure will be printed for later examination
    @owner varchar(64) = NULL,      -- Use this parameter if you are not the owner of the table
    @ommit_images bit = 0,          -- Use this parameter to generate INSERT statements by omitting the 'image' columns
    @ommit_identity bit = 0,        -- Use this parameter to ommit the identity columns
    @top int = NULL,            -- Use this parameter to generate INSERT statements only for the TOP n rows
    @cols_to_include varchar(8000) = NULL,  -- List of columns to be included in the INSERT statement
    @cols_to_exclude varchar(8000) = NULL,  -- List of columns to be excluded from the INSERT statement
    @disable_constraints bit = 0,       -- When 1, disables foreign key constraints and enables them after the INSERT statements
    @ommit_computed_cols bit = 0        -- When 1, computed columns will not be included in the INSERT statement

)
AS
BEGIN

/***********************************************************************************************************
Procedure:  sp_generate_inserts  (Build 22) 
        (Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.)

Purpose:    To generate INSERT statements from existing data. 
        These INSERTS can be executed to regenerate the data at some other location.
        This procedure is also useful to create a database setup, where in you can 
        script your data along with your table definitions.

Written by: Narayana Vyas Kondreddi
            http://vyaskn.tripod.com
            http://vyaskn.tripod.com/code/generate_inserts.txt

Acknowledgements:
        Divya Kalra -- For beta testing
        Mark Charsley   -- For reporting a problem with scripting uniqueidentifier columns with NULL values
        Artur Zeygman   -- For helping me simplify a bit of code for handling non-dbo owned tables
        Joris Laperre   -- For reporting a regression bug in handling text/ntext columns

Tested on:  SQL Server 7.0 and SQL Server 2000

Date created:   January 17th 2001 21:52 GMT

Date modified:  May 1st 2002 19:50 GMT

Email:      vyaskn@hotmail.com

NOTE:       This procedure may not work with tables with too many columns.
        Results can be unpredictable with huge text columns or SQL Server 2000's sql_variant data types
        Whenever possible, Use @include_column_list parameter to ommit column list in the INSERT statement, for better results
        IMPORTANT: This procedure is not tested with internation data (Extended characters or Unicode). If needed
        you might want to convert the datatypes of character variables in this procedure to their respective unicode counterparts
        like nchar and nvarchar


Example 1:  To generate INSERT statements for table 'titles':

        EXEC sp_generate_inserts 'titles'

Example 2:  To ommit the column list in the INSERT statement: (Column list is included by default)
        IMPORTANT: If you have too many columns, you are advised to ommit column list, as shown below,
        to avoid erroneous results

        EXEC sp_generate_inserts 'titles', @include_column_list = 0

Example 3:  To generate INSERT statements for 'titlesCopy' table from 'titles' table:

        EXEC sp_generate_inserts 'titles', 'titlesCopy'

Example 4:  To generate INSERT statements for 'titles' table for only those titles 
        which contain the word 'Computer' in them:
        NOTE: Do not complicate the FROM or WHERE clause here. It's assumed that you are good with T-SQL if you are using this parameter

        EXEC sp_generate_inserts 'titles', @from = "from titles where title like '%Computer%'"

Example 5:  To specify that you want to include TIMESTAMP column's data as well in the INSERT statement:
        (By default TIMESTAMP column's data is not scripted)

        EXEC sp_generate_inserts 'titles', @include_timestamp = 1

Example 6:  To print the debug information:

        EXEC sp_generate_inserts 'titles', @debug_mode = 1

Example 7:  If you are not the owner of the table, use @owner parameter to specify the owner name
        To use this option, you must have SELECT permissions on that table

        EXEC sp_generate_inserts Nickstable, @owner = 'Nick'

Example 8:  To generate INSERT statements for the rest of the columns excluding images
        When using this otion, DO NOT set @include_column_list parameter to 0.

        EXEC sp_generate_inserts imgtable, @ommit_images = 1

Example 9:  To generate INSERT statements excluding (ommiting) IDENTITY columns:
        (By default IDENTITY columns are included in the INSERT statement)

        EXEC sp_generate_inserts mytable, @ommit_identity = 1

Example 10:     To generate INSERT statements for the TOP 10 rows in the table:

        EXEC sp_generate_inserts mytable, @top = 10

Example 11:     To generate INSERT statements with only those columns you want:

        EXEC sp_generate_inserts titles, @cols_to_include = "'title','title_id','au_id'"

Example 12:     To generate INSERT statements by omitting certain columns:

        EXEC sp_generate_inserts titles, @cols_to_exclude = "'title','title_id','au_id'"

Example 13: To avoid checking the foreign key constraints while loading data with INSERT statements:

        EXEC sp_generate_inserts titles, @disable_constraints = 1

Example 14:     To exclude computed columns from the INSERT statement:
        EXEC sp_generate_inserts MyTable, @ommit_computed_cols = 1
***********************************************************************************************************/

SET NOCOUNT ON

--Making sure user only uses either @cols_to_include or @cols_to_exclude
IF ((@cols_to_include IS NOT NULL) AND (@cols_to_exclude IS NOT NULL))
    BEGIN
        RAISERROR('Use either @cols_to_include or @cols_to_exclude. Do not use both the parameters at once',16,1)
        RETURN -1 --Failure. Reason: Both @cols_to_include and @cols_to_exclude parameters are specified
    END

--Making sure the @cols_to_include and @cols_to_exclude parameters are receiving values in proper format
IF ((@cols_to_include IS NOT NULL) AND (PATINDEX('''%''',@cols_to_include) = 0))
    BEGIN
        RAISERROR('Invalid use of @cols_to_include property',16,1)
        PRINT 'Specify column names surrounded by single quotes and separated by commas'
        PRINT 'Eg: EXEC sp_generate_inserts titles, @cols_to_include = "''title_id'',''title''"'
        RETURN -1 --Failure. Reason: Invalid use of @cols_to_include property
    END

IF ((@cols_to_exclude IS NOT NULL) AND (PATINDEX('''%''',@cols_to_exclude) = 0))
    BEGIN
        RAISERROR('Invalid use of @cols_to_exclude property',16,1)
        PRINT 'Specify column names surrounded by single quotes and separated by commas'
        PRINT 'Eg: EXEC sp_generate_inserts titles, @cols_to_exclude = "''title_id'',''title''"'
        RETURN -1 --Failure. Reason: Invalid use of @cols_to_exclude property
    END


--Checking to see if the database name is specified along wih the table name
--Your database context should be local to the table for which you want to generate INSERT statements
--specifying the database name is not allowed
IF (PARSENAME(@table_name,3)) IS NOT NULL
    BEGIN
        RAISERROR('Do not specify the database name. Be in the required database and just specify the table name.',16,1)
        RETURN -1 --Failure. Reason: Database name is specified along with the table name, which is not allowed
    END

--Checking for the existence of 'user table' or 'view'
--This procedure is not written to work on system tables
--To script the data in system tables, just create a view on the system tables and script the view instead

IF @owner IS NULL
    BEGIN
        IF ((OBJECT_ID(@table_name,'U') IS NULL) AND (OBJECT_ID(@table_name,'V') IS NULL)) 
            BEGIN
                RAISERROR('User table or view not found.',16,1)
                PRINT 'You may see this error, if you are not the owner of this table or view. In that case use @owner parameter to specify the owner name.'
                PRINT 'Make sure you have SELECT permission on that table or view.'
                RETURN -1 --Failure. Reason: There is no user table or view with this name
            END
    END
ELSE
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @table_name AND (TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW') AND TABLE_SCHEMA = @owner)
            BEGIN
                RAISERROR('User table or view not found.',16,1)
                PRINT 'You may see this error, if you are not the owner of this table. In that case use @owner parameter to specify the owner name.'
                PRINT 'Make sure you have SELECT permission on that table or view.'
                RETURN -1 --Failure. Reason: There is no user table or view with this name      
            END
    END

--Variable declarations
DECLARE     @Column_ID int,         
        @Column_List varchar(8000), 
        @Column_Name varchar(128), 
        @Start_Insert varchar(786), 
        @Data_Type varchar(128), 
        @Actual_Values varchar(8000),   --This is the string that will be finally executed to generate INSERT statements
        @IDN varchar(128)       --Will contain the IDENTITY column's name in the table

--Variable Initialization
SET @IDN = ''
SET @Column_ID = 0
SET @Column_Name = ''
SET @Column_List = ''
SET @Actual_Values = ''

IF @owner IS NULL 
    BEGIN
        SET @Start_Insert = 'INSERT INTO ' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']' 
    END
ELSE
    BEGIN
        SET @Start_Insert = 'INSERT ' + '[' + LTRIM(RTRIM(@owner)) + '].' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']'      
    END


--To get the first column's ID

SELECT  @Column_ID = MIN(ORDINAL_POSITION)  
FROM    INFORMATION_SCHEMA.COLUMNS (NOLOCK) 
WHERE   TABLE_NAME = @table_name AND
(@owner IS NULL OR TABLE_SCHEMA = @owner)



--Loop through all the columns of the table, to get the column names and their data types
WHILE @Column_ID IS NOT NULL
    BEGIN
        SELECT  @Column_Name = QUOTENAME(COLUMN_NAME), 
        @Data_Type = DATA_TYPE 
        FROM    INFORMATION_SCHEMA.COLUMNS (NOLOCK) 
        WHERE   ORDINAL_POSITION = @Column_ID AND 
        TABLE_NAME = @table_name AND
        (@owner IS NULL OR TABLE_SCHEMA = @owner)



        IF @cols_to_include IS NOT NULL --Selecting only user specified columns
        BEGIN
            IF CHARINDEX( '''' + SUBSTRING(@Column_Name,2,LEN(@Column_Name)-2) + '''',@cols_to_include) = 0 
            BEGIN
                GOTO SKIP_LOOP
            END
        END

        IF @cols_to_exclude IS NOT NULL --Selecting only user specified columns
        BEGIN
            IF CHARINDEX( '''' + SUBSTRING(@Column_Name,2,LEN(@Column_Name)-2) + '''',@cols_to_exclude) <> 0 
            BEGIN
                GOTO SKIP_LOOP
            END
        END

        --Making sure to output SET IDENTITY_INSERT ON/OFF in case the table has an IDENTITY column
        IF (SELECT COLUMNPROPERTY( OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name),SUBSTRING(@Column_Name,2,LEN(@Column_Name) - 2),'IsIdentity')) = 1 
        BEGIN
            IF @ommit_identity = 0 --Determing whether to include or exclude the IDENTITY column
                SET @IDN = @Column_Name
            ELSE
                GOTO SKIP_LOOP          
        END

        --Making sure whether to output computed columns or not
        IF @ommit_computed_cols = 1
        BEGIN
            IF (SELECT COLUMNPROPERTY( OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name),SUBSTRING(@Column_Name,2,LEN(@Column_Name) - 2),'IsComputed')) = 1 
            BEGIN
                GOTO SKIP_LOOP                  
            END
        END

        --Tables with columns of IMAGE data type are not supported for obvious reasons
        IF(@Data_Type in ('image'))
            BEGIN
                IF (@ommit_images = 0)
                    BEGIN
                        RAISERROR('Tables with image columns are not supported.',16,1)
                        PRINT 'Use @ommit_images = 1 parameter to generate INSERTs for the rest of the columns.'
                        PRINT 'DO NOT ommit Column List in the INSERT statements. If you ommit column list using @include_column_list=0, the generated INSERTs will fail.'
                        RETURN -1 --Failure. Reason: There is a column with image data type
                    END
                ELSE
                    BEGIN
                    GOTO SKIP_LOOP
                    END
            END

        --Determining the data type of the column and depending on the data type, the VALUES part of
        --the INSERT statement is generated. Care is taken to handle columns with NULL values. Also
        --making sure, not to lose any data from flot, real, money, smallmomey, datetime columns
        SET @Actual_Values = @Actual_Values  +
        CASE 
            WHEN @Data_Type IN ('char','varchar','nchar','nvarchar') 
                THEN 
                    'COALESCE('''''''' + REPLACE(RTRIM(' + @Column_Name + '),'''''''','''''''''''')+'''''''',''NULL'')'
            WHEN @Data_Type IN ('datetime','smalldatetime') 
                THEN 
                    'COALESCE('''''''' + RTRIM(CONVERT(char,' + @Column_Name + ',109))+'''''''',''NULL'')'
            WHEN @Data_Type IN ('uniqueidentifier') 
                THEN  
                    'COALESCE('''''''' + REPLACE(CONVERT(char(255),RTRIM(' + @Column_Name + ')),'''''''','''''''''''')+'''''''',''NULL'')'
            WHEN @Data_Type IN ('text','ntext') 
                THEN  
                    'COALESCE('''''''' + REPLACE(CONVERT(char(8000),' + @Column_Name + '),'''''''','''''''''''')+'''''''',''NULL'')'                    
            WHEN @Data_Type IN ('binary','varbinary') 
                THEN  
                    'COALESCE(RTRIM(CONVERT(char,' + 'CONVERT(int,' + @Column_Name + '))),''NULL'')'  
            WHEN @Data_Type IN ('timestamp','rowversion') 
                THEN  
                    CASE 
                        WHEN @include_timestamp = 0 
                            THEN 
                                '''DEFAULT''' 
                            ELSE 
                                'COALESCE(RTRIM(CONVERT(char,' + 'CONVERT(int,' + @Column_Name + '))),''NULL'')'  
                    END
            WHEN @Data_Type IN ('float','real','money','smallmoney')
                THEN
                    'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, ' +  @Column_Name  + ',2)' + ')),''NULL'')' 
            ELSE 
                'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, ' +  @Column_Name  + ')' + ')),''NULL'')' 
        END   + '+' +  ''',''' + ' + '

        --Generating the column list for the INSERT statement
        SET @Column_List = @Column_List +  @Column_Name + ','   

        SKIP_LOOP: --The label used in GOTO

        SELECT  @Column_ID = MIN(ORDINAL_POSITION) 
        FROM    INFORMATION_SCHEMA.COLUMNS (NOLOCK) 
        WHERE   TABLE_NAME = @table_name AND 
        ORDINAL_POSITION > @Column_ID AND
        (@owner IS NULL OR TABLE_SCHEMA = @owner)


    --Loop ends here!
    END

--To get rid of the extra characters that got concatenated during the last run through the loop
SET @Column_List = LEFT(@Column_List,len(@Column_List) - 1)
SET @Actual_Values = LEFT(@Actual_Values,len(@Actual_Values) - 6)

IF LTRIM(@Column_List) = '' 
    BEGIN
        RAISERROR('No columns to select. There should at least be one column to generate the output',16,1)
        RETURN -1 --Failure. Reason: Looks like all the columns are ommitted using the @cols_to_exclude parameter
    END

--Forming the final string that will be executed, to output the INSERT statements
IF (@include_column_list <> 0)
    BEGIN
        SET @Actual_Values = 
            'SELECT ' +  
            CASE WHEN @top IS NULL OR @top < 0 THEN '' ELSE ' TOP ' + LTRIM(STR(@top)) + ' ' END + 
            '''' + RTRIM(@Start_Insert) + 
            ' ''+' + '''(' + RTRIM(@Column_List) +  '''+' + ''')''' + 
            ' +''VALUES(''+ ' +  @Actual_Values  + '+'')''' + ' ' + 
            COALESCE(@from,' FROM ' + CASE WHEN @owner IS NULL THEN '' ELSE '[' + LTRIM(RTRIM(@owner)) + '].' END + '[' + rtrim(@table_name) + ']' + '(NOLOCK)')
    END
ELSE IF (@include_column_list = 0)
    BEGIN
        SET @Actual_Values = 
            'SELECT ' + 
            CASE WHEN @top IS NULL OR @top < 0 THEN '' ELSE ' TOP ' + LTRIM(STR(@top)) + ' ' END + 
            '''' + RTRIM(@Start_Insert) + 
            ' '' +''VALUES(''+ ' +  @Actual_Values + '+'')''' + ' ' + 
            COALESCE(@from,' FROM ' + CASE WHEN @owner IS NULL THEN '' ELSE '[' + LTRIM(RTRIM(@owner)) + '].' END + '[' + rtrim
  
90
30.08.2019 08:00:28
Это отлично сработало для меня, за исключением того, что сгенерированные INSERT не имеют точки с запятой в конце. Я добавил это и использовал это с успехом. Спасибо за ответ на вопрос!
JosephStyons 11.06.2009 19:57:36
@jcollum - это на самом деле не встроенная хранимая процедура. Если вы перейдете по ссылке, вы можете получить текст для сохраненного процесса.
Shane Fulmer 28.07.2009 20:32:54
Я получаю - Сообщение 536, Уровень 16, Состояние 5, Процедура sp_generate_inserts, Строка 331 Неверный параметр длины, переданный в функцию SUBSTRING. Сообщение 536, Уровень 16, Состояние 5, Процедура sp_generate_inserts, Строка 332 Неверный параметр длины, переданный в функцию SUBSTRING. Сообщение 50000, уровень 16, состояние 1, процедура sp_generate_inserts, строка 336 Нет столбцов для выбора. Должен быть хотя бы один столбец для генерации вывода. Почему?
Nimrod Shory 7.12.2009 16:11:48
Я тоже получил эту ошибку. Чтобы исправить это, замените «EXEC master.dbo.sp_MS_upd_sysobj_category 2» на «EXEC sp_MS_marksystemobject sp_generate_inserts» и удалите строку «EXEC master.dbo.sp_MS_upd_sysobj_category 1».
Dan Nolan 16.02.2012 09:46:20
@InfinitiesLoop, только то, что иногда вам нужно иметь возможность автоматизировать его с помощью кода, а не пользователь вручную выполнять задачу через графический интерфейс.
CaffGeek 25.06.2013 17:37:51

Не используйте вставки, используйте BCP

4
11.06.2009 17:48:45
Действительно в большинстве случаев, но могут быть веские причины для использования вставок.
Steve Homer 27.10.2010 13:09:09
Действительно, @Steve Гомер. Получение хорошего сценария инициализации БД, например, для проектов EF Code First. Да, много раз, когда мне нужна была эта функциональность. ППГ просто не подходит.
Chris Simmons 20.12.2011 20:01:50

Не уверен, правильно ли я понимаю ваш вопрос.

Если у вас есть данные в MS-Access, которые вы хотите перенести на SQL Server - вы можете использовать DTS.
И, я полагаю, вы могли бы использовать профилировщик SQL для просмотра всех операторов INSERT.

0
11.06.2009 17:52:00

У вас еще есть данные в производственной базе данных? Если это так, вы можете настроить период обновления данных через DTS. Мы проводим наши еженедельные выходные, и очень приятно иметь чистые реальные данные каждую неделю для нашего тестирования.

Если у вас еще нет производства, то вы должны создать базу данных, которая будет нужна вам (свежая). Затем продублируйте эту базу данных и используйте эту вновь созданную базу данных в качестве тестовой среды. Если вам нужна чистая версия, просто дублируйте свою чистую версию еще раз, и Боб станет вашим дядей .

1
11.06.2009 18:11:12

Первая ссылка на sp_generate_inserts довольно крутая, вот действительно простая версия:

DECLARE @Fields VARCHAR(max); SET @Fields = '[QueueName], [iSort]' -- your fields, keep []
DECLARE @Table  VARCHAR(max); SET @Table  = 'Queues'               -- your table

DECLARE @SQL    VARCHAR(max)
SET @SQL = 'DECLARE @S VARCHAR(MAX)
SELECT @S = ISNULL(@S + '' UNION '', ''INSERT INTO ' + @Table + '(' + @Fields + ')'') + CHAR(13) + CHAR(10) + 
 ''SELECT '' + ' + REPLACE(REPLACE(REPLACE(@Fields, ',', ' + '', '' + '), '[', ''''''''' + CAST('),']',' AS VARCHAR(max)) + ''''''''') +' FROM ' + @Table + '
PRINT @S'

EXEC (@SQL)

В моей системе я получаю такой результат:

INSERT INTO Queues([QueueName], [iSort])
SELECT 'WD: Auto Capture', '10' UNION 
SELECT 'Car/Lar', '11' UNION 
SELECT 'Scan Line', '21' UNION 
SELECT 'OCR', '22' UNION 
SELECT 'Dynamic Template', '23' UNION 
SELECT 'Fix MICR', '41' UNION 
SELECT 'Fix MICR (Supervisor)', '42' UNION 
SELECT 'Foreign MICR', '43' UNION 
...
9
24.02.2012 14:39:48

Возможно, вы можете попробовать мастер публикации SQL Server http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

Он имеет мастер, который поможет вам сценарий вставки операторов.

4
12.07.2009 02:59:59
он предварительно установлен: «C: \ Program Files (x86) \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4 \ SqlPubWiz.exe»
Brabbeldas 27.06.2013 12:36:19

Вы можете использовать SSMS Tools Pack (доступно для SQL Server 2005 и 2008). Он поставляется с функцией генерации операторов вставки.

http://www.ssmstoolspack.com/

27
12.07.2009 19:48:19
Единственный инструмент работал для очень большого контента nvarchar (max) с вкладками и новыми строками.
Matej 27.08.2012 22:05:28

Я также много исследовал это, но я не мог найти конкретного решения для этого. В настоящее время я придерживаюсь подхода, который заключается в том, чтобы скопировать содержимое в excel из студии управления SQL Server, а затем импортировать данные в Oracle-TOAD и затем сгенерировать операторы вставки.

0
16.07.2009 02:39:40
Здравствуйте, Vineet, если вы попробуете мое решение и дадите мне знать, что вам не подходит, я с радостью помогу вам с автоматической генерацией SQL-скриптов. github.com/drumsta/sql-generate-insert
drumsta 29.07.2016 21:16:23

Хранимая процедура Джейн Даллауэй: http://docs.google.com/leaf?id=0B_AkC4ZdTI9tNWVmZWU3NzAtMWY1My00NjgwLWI3ZjQtMTY1NDMxYzBhYzgx&hl=en_GB . Документация представляет собой серию сообщений в блоге: https://www.google.com/search?q=spu_generateinsert&as_sitesearch=http%3A%2F%2Fjane.dallaway.com

12
2.11.2012 09:40:44
Просто для справки, теперь они перенесены: хранимая процедура: docs.google.com/… документация в виде серии постов в блоге: jane.dallaway.com/tag/spu_generateinsert
Jane 7.02.2010 09:35:50
Одним из важных преимуществ этого подхода является возможность добавления фильтров к выбранным данным.
jruizaranguren 17.09.2014 10:15:43
Когда я использовал скрипт, который был у нее на странице github, он генерировал JSON, но это не то, чего я ожидал. Не работал для меня :(
Don Rolling 20.03.2020 16:09:44

Я использую sqlite, чтобы сделать это. Я нахожу это очень, очень полезным для создания тестовых / тестовых баз данных.

sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql

2
22.07.2009 17:31:17

Я использовал этот скрипт, который я поместил в своем блоге ( Как сгенерировать процедуры вставки операторов на сервере SQL ).

Пока что это работает для меня, хотя они могут быть ошибками, которые я еще не обнаружил.

3
30.01.2015 14:29:45

Как упомянуто @Mike Ritacco, но обновлено для SSMS 2008 R2

  1. Щелкните правой кнопкой мыши на имени базы данных
  2. Выберите «Задачи»> «Создать сценарии».
  3. В зависимости от ваших настроек страница вступления может отображаться или нет
  4. Выберите «Выбрать конкретные объекты базы данных»,
  5. Разверните дерево и проверьте соответствующие таблицы
  6. Нажмите кнопку "Далее
  7. Нажмите Дополнительно
  8. В разделе «Общие» выберите соответствующий параметр «Типы данных для сценария».
  9. Завершить работу мастера

Затем вы получите все операторы INSERT для данных прямо из SSMS.

РЕДАКТИРОВАТЬ 2016-10-25 SQL Server 2016 / SSMS 13.0.15900.1

  1. Щелкните правой кнопкой мыши на имени базы данных

  2. Выберите «Задачи»> «Создать сценарии».

  3. В зависимости от ваших настроек страница вступления может отображаться или нет

  4. Выберите «Выбрать конкретные объекты базы данных»,

  5. Разверните дерево и проверьте соответствующие таблицы

  6. Нажмите кнопку "Далее

  7. Нажмите Дополнительно

  8. В разделе «Общие» выберите соответствующий параметр «Типы данных для сценария».

  9. Нажмите ОК

  10. Укажите, хотите ли вы, чтобы выходные данные переходили к новому запросу, буферу обмена или файлу

  11. Нажмите Next дважды

  12. Ваш скрипт подготовлен в соответствии с настройками, которые вы выбрали выше

  13. Нажмите Готово

43
31.12.2016 18:31:14
хм, я не знаю, используем ли мы разные версии SSMS 2008 R2, но у меня нет никакой «расширенной» опции. что мне нужно было сделать, это выбрать «данные скрипта» на шаге «выбрать параметры скрипта». (Кстати, такой опции нет в экспресс-выпуске)
Andy 7.10.2011 11:39:08

Я использую SSMS 2008 версии 10.0.5500.0. В этой версии в составе мастера создания сценариев вместо кнопки «Дополнительно» имеется экран ниже. В этом случае я хотел вставить только данные и не создавать операторы, поэтому мне пришлось изменить два обведенных свойстваПараметры скрипта

23
5.04.2012 08:01:03

Мой вклад в решение этой проблемы - генератор сценариев Powershell INSERT, который позволяет создавать сценарии для нескольких таблиц без необходимости использовать громоздкий графический интерфейс SSMS. Отлично подходит для быстрого сохранения «начальных» данных в системе контроля версий.

  1. Сохраните приведенный ниже скрипт как «filename.ps1».
  2. Сделайте свои собственные модификации в областях под "CUSTOMIZE ME".
  3. Вы можете добавить список таблиц в скрипт в любом порядке.
  4. Вы можете открыть сценарий в Powershell ISE и нажать кнопку «Воспроизвести» или просто выполнить сценарий в командной строке Powershell.

По умолчанию сгенерированный скрипт INSERT будет «SeedData.sql» в той же папке, что и скрипт.

Вам понадобятся установленные сборки объектов управления SQL Server, которые должны быть там, если у вас установлена ​​SSMS.

Add-Type -AssemblyName ("Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
Add-Type -AssemblyName ("Microsoft.SqlServer.ConnectionInfo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")



#CUSTOMIZE ME
$outputFile = ".\SeedData.sql"
$connectionString = "Data Source=.;Initial Catalog=mydb;Integrated Security=True;"



$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString)
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection)
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($conn)
$db = $srv.Databases[$srv.ConnectionContext.DatabaseName]
$scr = New-Object Microsoft.SqlServer.Management.Smo.Scripter $srv
$scr.Options.FileName = $outputFile
$scr.Options.AppendToFile = $false
$scr.Options.ScriptSchema = $false
$scr.Options.ScriptData = $true
$scr.Options.NoCommandTerminator = $true

$tables = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection



#CUSTOMIZE ME
$tables.Add($db.Tables["Category"].Urn)
$tables.Add($db.Tables["Product"].Urn)
$tables.Add($db.Tables["Vendor"].Urn)



[void]$scr.EnumScript($tables)

$sqlConnection.Close()
8
12.05.2015 15:39:55

Если вам нужен программный доступ, вы можете использовать хранимую процедуру с открытым исходным кодом `GenerateInsert.

ВСТАВИТЬ оператор (ы) генератор

В качестве простого и быстрого примера для создания операторов INSERT для таблицы AdventureWorks.Person.AddressTypeвыполните следующие операторы:

USE [AdventureWorks];
GO
EXECUTE dbo.GenerateInsert @ObjectName = N'Person.AddressType';

Это сгенерирует следующий скрипт:

SET NOCOUNT ON
SET IDENTITY_INSERT Person.AddressType ON
INSERT INTO Person.AddressType
([AddressTypeID],[Name],[rowguid],[ModifiedDate])
VALUES
 (1,N'Billing','B84F78B1-4EFE-4A0E-8CB7-70E9F112F886',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(2,N'Home','41BC2FF6-F0FC-475F-8EB9-CEC0805AA0F2',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(3,N'Main Office','8EEEC28C-07A2-4FB9-AD0A-42D4A0BBC575',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(4,N'Primary','24CB3088-4345-47C4-86C5-17B535133D1E',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(5,N'Shipping','B29DA3F8-19A3-47DA-9DAA-15C84F4A83A5',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(6,N'Archive','A67F238A-5BA2-444B-966C-0467ED9C427F',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
SET IDENTITY_INSERT Person.AddressType OFF
11
14.12.2015 22:26:59
хорошая работа! просто и делает то, что должен был сделать. надеюсь использовать это в течение долгого времени :)
anar khalilov 22.03.2017 06:00:04
заметив ошибку в коде, я сделал запрос на github. Спасибо, что поделился.
anar khalilov 27.03.2017 10:52:07
на самом деле это работает лучше, чем EXEC sp_generate_inserts 'title'
user11156893 5.04.2019 04:16:36
@drumsta Можете ли вы добавить параметр Включить столбец, Исключить параметр списка столбцов, если это необходимо, сейчас мне нужно всего несколько столбцов из моей таблицы? Спасибо
user11156893 15.04.2019 22:54:06
спасибо, это сработало для меня
Don Rolling 20.03.2020 16:10:46

Это можно сделать с помощью Visual Studioтоже (по крайней мере, в версии 2013 года).

В VS 2013 также можно отфильтровать список строк, на которых основан оператор insert, что, как я знаю, в SSMS невозможно.

Выполните следующие шаги:

  • Откройте окно «Обозреватель объектов SQL Server» (меню: / Вид / Обозреватель объектов SQL Server)
  • Открыть / развернуть базу данных и ее таблицы
  • Щелкните правой кнопкой мыши по таблице и выберите «Просмотр данных» из контекстного меню.
  • Это отобразит данные в основной области
  • Необязательный шаг: щелкните значок фильтра «Сортировать и отфильтровать набор данных» (четвертый значок слева в строке над результатом) и применить фильтр к одному или нескольким столбцам.
  • Нажмите на значки «Скрипт» или «Скрипт в файл» (значки справа в верхнем ряду выглядят как маленькие листочки бумаги)

Это создаст (условные) операторы вставки для выбранной таблицы в активное окно или файл.


Кнопки «Фильтр» и «Скрипт» Visual Studio 2013 :

введите описание изображения здесь

41
27.06.2016 09:44:40
Теперь я предпочитаю извлекать записи из одной базы данных для вставки куда-то еще - это кажется намного проще, чем проходить через мастер в SSMS.
Michael12345 5.09.2016 04:36:09
Я не мог получить это для экспорта двоичных полей :(
Mafu Josh 13.09.2016 16:05:56
Ваше сообщение является правильным и простым способом использования инструментов данных SQL Server в Visual Studio. Здесь аналогичный пост, в котором объясняется, как помогает генерировать оператор вставки для первых 1000 строк .
shaijut 22.11.2016 07:34:24

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

  • Генератор имен для имен и мест людей
  • Возможность сохранить профиль Generation (после его загрузки и настройки локально)
  • Возможность настраивать и управлять генерацией с помощью сценариев
  • Множество различных выходных данных (CSV, Javascript, JSON и т. Д.) Для данных (на случай, если вам нужно протестировать набор в разных средах и пропустить доступ к базе данных)
  • Бесплатно . Но подумайте о пожертвовании, если вы найдете программное обеспечение полезным :).

графический интерфейс пользователя

4
8.09.2016 07:04:28
У меня никогда не было проблем с этим, и я использовал это много раз. Возможно, вы не используете ту версию, для которой создано приложение. В худшем случае вы можете создать пользовательский вывод, используя их «Использовать пользовательский формат HTML». Я думаю, что это отличный инструмент.
Klik 22.02.2017 17:06:49
Он не отображает типы правильно, а также пример данных и оператор вставки создают неправильные цитаты, мне пришлось пройтись, чтобы очистить довольно немного сценария. Но в итоге понял, дбщема стала лучше ИМХО
transformer 22.02.2017 17:24:16
Интересно, я не нашел это и то удивление о том, как вы использовали это. Во всяком случае, каждому свое.
Klik 22.02.2017 17:57:58
да, это работает для самых простых вещей, я позволю владельцу сайта знать в прошлом году, но вывод, на который я ссылаюсь, это опция DB для создания сценария для Sql Server. Это прискорбно, так как сценарий проделывает большой путь ... но вставка записей в 1000 таблиц может раздражать ... все же хороший инструмент для быстрой работы
transformer 23.02.2017 02:46:50

Если вы предпочитаете использовать Google Sheets, используйте SeekWell для отправки таблицы на лист, а затем вставьте строки в расписание по мере их добавления в лист.

Смотрите здесь для пошагового процесса, или посмотрите демонстрацию видео функции здесь.

1
23.05.2019 17:51:28

Вы можете сгенерировать оператор INSERT или MERGE с помощью этого простого и бесплатного приложения, которое я написал несколько лет назад:
Data Script Writer (Настольное приложение для Windows)

введите описание изображения здесь Кроме того, я недавно написал в блоге об этих инструментах и ​​подходе к использованию SSDT для базы данных развертывания с данными. Узнайте больше:
Сценарий и развертывание данных для базы данных из проекта SSDT

0
2.11.2019 11:57:00