0

When using "Generate Script" feature in MS SQL Management Studio we get data exported as well, but all values are inserted in a separate steps, which looks something like

INSERT [dbo].[table] ([table_id], [table_version], [table_timestamp], [table_user], [table_percent], [table_hid], [table_latestversionid], [table_isdeleted]) VALUES (3, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 30 %', NULL, 13, 0)
INSERT [dbo].[table] ([table_id], [table_version], [table_timestamp], [table_user], [table_percent], [table_hid], [table_latestversionid], [table_isdeleted]) VALUES (4, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 40 %', NULL, 14, 0)
INSERT [dbo].[table] ([table_id], [table_version], [table_timestamp], [table_user], [table_percent], [table_hid], [table_latestversionid], [table_isdeleted]) VALUES (5, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 50 %', NULL, 15, 0)
INSERT [dbo].[table] ([table_id], [table_version], [table_timestamp], [table_user], [table_percent], [table_hid], [table_latestversionid], [table_isdeleted]) VALUES (6, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 60 %', NULL, 16, 0)
INSERT [dbo].[table] ([table_id], [table_version], [table_timestamp], [table_user], [table_percent], [table_hid], [table_latestversionid], [table_isdeleted]) VALUES (7, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 70 %', NULL, 17, 0)
INSERT [dbo].[table] ([table_id], [table_version], [table_timestamp], [table_user], [table_percent], [table_hid], [table_latestversionid], [table_isdeleted]) VALUES (8, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 80 %', NULL, 18, 0)

Is there any way to make this script generation and forcing SSMS to create insert queries in a single or several larger steps, like:

INSERT [dbo].[table] ([table_id], [table_version], [table_timestamp], [table_user], [table_percent], [table_hid], [table_latestversionid], [table_isdeleted]) 
VALUES 
(3, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 30 %', NULL, 13, 0),
(4, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 40 %', NULL, 14, 0),
(5, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 50 %', NULL, 15, 0),
(6, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 60 %', NULL, 16, 0),
(7, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 70 %', NULL, 17, 0),
(8, -1, CAST(N'2015-06-04 13:03:38.000' AS DateTime), N'init', N' 80 %', NULL, 18, 0);

Thanks

5
  • 4
    VALUES has a limit of 1000 rows (possibly subject to change in newer versions), so such a feature would be of limited use to begin with. I'm going to bet money it hasn't been built. You can trivially achieve the effect yourself by search-replacing the boilerplate, but to get any kind of performance inserting the data, the whole script approach should be scrapped in favor of bulk copying data. (Also, wrapping the existing statements in a BEGIN TRANSACTION ... COMMIT has benefits, as it is the separate commits and not the size of the statement that makes this inefficient.) Commented Sep 12, 2017 at 12:03
  • 1
    Second script has limitation in 1000 rows, maybe that's why they do not do like that Commented Sep 12, 2017 at 12:03
  • Well, MySQL had this since I do not remember when, but MSSQL prefers to garbage script files. Pity. Commented Sep 12, 2017 at 12:48
  • 1
    Management Studio is not SQL Server, it's just one GUI you can manage the database with that happens to be shipped by Microsoft itself. If you don't like the way it does things, there are alternatives (like Redgate's tools). There's also the data import/export wizard built into Management Studio itself, which is absurdly more efficient than any script inserting data. Commented Sep 12, 2017 at 12:56
  • We need scripts for our purposes, even backing up as *.bak file would be easier, but doesn't help us a lot. Commented Sep 12, 2017 at 13:43

1 Answer 1

2
    --First Create The SP GenerateInsert The Run The Below Mention CODE Which will give the Desire Output..

      IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.GenerateInsert') AND type in (N'P', N'PC'))
      DROP PROCEDURE dbo.GenerateInsert;
    GO

    CREATE PROCEDURE dbo.GenerateInsert
    (
      @ObjectName nvarchar(261)
    , @TargetObjectName nvarchar(261) = NULL
    , @OmmitInsertColumnList bit = 0
    , @GenerateSingleInsertPerRow bit = 0
    , @UseSelectSyntax bit = 0
    , @UseColumnAliasInSelect bit = 0
    , @FormatCode bit = 1
    , @GenerateOneColumnPerLine bit = 0
    , @GenerateGo bit = 0
    , @PrintGeneratedCode bit = 1
    , @TopExpression nvarchar(max) = NULL
    , @FunctionParameters nvarchar(max) = NULL
    , @SearchCondition nvarchar(max) = NULL
    , @OrderByExpression nvarchar(max) = NULL
    , @OmmitUnsupportedDataTypes bit = 1
    , @PopulateIdentityColumn bit = 0
    , @PopulateTimestampColumn bit = 0
    , @PopulateComputedColumn bit = 0
    , @GenerateProjectInfo bit = 1
    , @GenerateSetNoCount bit = 1
    , @GenerateStatementTerminator bit = 1
    , @ShowWarnings bit = 1
    , @Debug bit = 0
    )
    AS

    BEGIN
    SET NOCOUNT ON;

    DECLARE @CrLf char(2)
    SET @CrLf = CHAR(13) + CHAR(10);
    DECLARE @ColumnName sysname;
    DECLARE @DataType sysname;
    DECLARE @ColumnList nvarchar(max);
    SET @ColumnList = N'';
    DECLARE @SelectList nvarchar(max);
    SET @SelectList = N'';
    DECLARE @SelectStatement nvarchar(max);
    SET @SelectStatement = N'';
    DECLARE @OmittedColumnList nvarchar(max);
    SET @OmittedColumnList = N'';
    DECLARE @InsertSql nvarchar(max);
    SET @InsertSql = N'INSERT INTO ' + COALESCE(@TargetObjectName,@ObjectName);
    DECLARE @ValuesSql nvarchar(max);
    SET @ValuesSql = N'VALUES (';
    DECLARE @SelectSql nvarchar(max);
    SET @SelectSql = N'SELECT ';
    DECLARE @TableData table (TableRow nvarchar(max));
    DECLARE @Results table (TableRow nvarchar(max));
    DECLARE @TableRow nvarchar(max);
    DECLARE @RowNo int;

    IF PARSENAME(@ObjectName,3) IS NOT NULL
      OR PARSENAME(@ObjectName,4) IS NOT NULL
    BEGIN
      RAISERROR(N'Server and database names are not allowed to specify in @ObjectName parameter. Required format is [schema_name.]object_name',16,1);
      RETURN -1;
    END

    IF OBJECT_ID(@ObjectName,N'U') IS NULL -- USER_TABLE
      AND OBJECT_ID(@ObjectName,N'V') IS NULL -- VIEW
      AND OBJECT_ID(@ObjectName,N'IF') IS NULL -- SQL_INLINE_TABLE_VALUED_FUNCTION
      AND OBJECT_ID(@ObjectName,N'TF') IS NULL -- SQL_TABLE_VALUED_FUNCTION
    BEGIN
      RAISERROR(N'User table, view, table-valued or inline function %s not found or insuficient permission to query the provided object.',16,1,@ObjectName);
      RETURN -1;
    END

    IF NOT EXISTS (
      SELECT 1
      FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_TYPE IN ('BASE TABLE','VIEW')
        AND TABLE_NAME = PARSENAME(@ObjectName,1)
        AND (TABLE_SCHEMA = PARSENAME(@ObjectName,2)
          OR PARSENAME(@ObjectName,2) IS NULL)
    ) AND NOT EXISTS (
      SELECT *
      FROM INFORMATION_SCHEMA.ROUTINES
      WHERE ROUTINE_TYPE IN ('FUNCTION')
        AND DATA_TYPE = 'TABLE'
        AND SPECIFIC_NAME = PARSENAME(@ObjectName,1)
        AND (SPECIFIC_SCHEMA = PARSENAME(@ObjectName,2)
          OR PARSENAME(@ObjectName,2) IS NULL)
    )
    BEGIN
      RAISERROR(N'User table, view, table-valued or inline function %s not found or insuficient permission to query the provided object.',16,1,@ObjectName);
      RETURN -1;
    END

    DECLARE ColumnCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT c.name ColumnName
    ,COALESCE(TYPE_NAME(c.system_type_id),t.name) DataType
    FROM sys.objects o
      INNER JOIN sys.columns c ON c.object_id = o.object_id
      LEFT JOIN sys.types t ON t.system_type_id = c.system_type_id
        AND t.user_type_id = c.user_type_id
    WHERE o.type IN (N'U',N'V',N'IF',N'TF')
      -- U = USER_TABLE
      -- V = VIEW
      -- IF = SQL_INLINE_TABLE_VALUED_FUNCTION
      -- TF = SQL_TABLE_VALUED_FUNCTION
      AND (o.object_id = OBJECT_ID(@ObjectName)
        OR o.name = @ObjectName)
      AND (COLUMNPROPERTY(c.object_id,c.name,'IsIdentity') != 1
        OR @PopulateIdentityColumn = 1)
      AND (COLUMNPROPERTY(c.object_id,c.name,'IsComputed') != 1
        OR @PopulateComputedColumn = 1)
    ORDER BY COLUMNPROPERTY(c.object_id,c.name,'ordinal') -- ORDINAL_POSITION
    FOR READ ONLY
    ;
    OPEN ColumnCursor;
    FETCH NEXT FROM ColumnCursor INTO @ColumnName,@DataType;

    WHILE @@FETCH_STATUS = 0
    BEGIN
      -- Handle different data types
      DECLARE @ColumnExpression nvarchar(max);
      SET @ColumnExpression = 
        CASE
        WHEN @DataType IN ('char','varchar','text','uniqueidentifier')
        THEN N'ISNULL(''''''''+REPLACE(CONVERT(varchar(max),'+  QUOTENAME(@ColumnName) + N'),'''''''','''''''''''')+'''''''',''NULL'') COLLATE database_default'

        WHEN @DataType IN ('nchar','nvarchar','sysname','ntext','sql_variant','xml')
        THEN N'ISNULL(''N''''''+REPLACE(CONVERT(nvarchar(max),'+  QUOTENAME(@ColumnName) + N'),'''''''','''''''''''')+'''''''',''NULL'') COLLATE database_default'

        WHEN @DataType IN ('int','bigint','smallint','tinyint','decimal','numeric','bit')
        THEN N'ISNULL(CONVERT(varchar(max),'+  QUOTENAME(@ColumnName) + N'),''NULL'') COLLATE database_default'

        WHEN @DataType IN ('float','real','money','smallmoney')
        THEN N'ISNULL(CONVERT(varchar(max),'+  QUOTENAME(@ColumnName) + N',2),''NULL'') COLLATE database_default'

        WHEN @DataType IN ('datetime','smalldatetime','date','time','datetime2','datetimeoffset')
        THEN N'''CONVERT('+@DataType+',''+ISNULL(''''''''+CONVERT(varchar(max),'+  QUOTENAME(@ColumnName) + N',121)+'''''''',''NULL'') COLLATE database_default' + '+'',121)'''

        WHEN @DataType IN ('rowversion','timestamp')
        THEN
          CASE WHEN @PopulateTimestampColumn = 1
          THEN N'''CONVERT(varbinary(max),''+ISNULL(''''''''+CONVERT(varchar(max),CONVERT(varbinary(max),'+  QUOTENAME(@ColumnName) + N'),1)+'''''''',''NULL'') COLLATE database_default' + '+'',1)'''
          ELSE N'''NULL''' END

        WHEN @DataType IN ('binary','varbinary','image')
        THEN N'''CONVERT(varbinary(max),''+ISNULL(''''''''+CONVERT(varchar(max),CONVERT(varbinary(max),'+  QUOTENAME(@ColumnName) + N'),1)+'''''''',''NULL'') COLLATE database_default' + '+'',1)'''

        WHEN @DataType IN ('geography')
        -- convert geography to text: ?? column.STAsText();
        -- convert text to geography: ?? geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326);
        THEN NULL

        ELSE NULL END;

      IF @ColumnExpression IS NULL
        AND @OmmitUnsupportedDataTypes != 1
      BEGIN
        RAISERROR(N'Datatype %s is not supported. Use @OmmitUnsupportedDataTypes to exclude unsupported columns.',16,1,@DataType);
        RETURN -1;
      END

      IF @ColumnExpression IS NULL
      BEGIN
        SET @OmittedColumnList = @OmittedColumnList
          + CASE WHEN @OmittedColumnList != N'' THEN N'; ' ELSE N'' END
          + N'column ' + QUOTENAME(@ColumnName)
          + N', datatype ' + @DataType;
      END

      IF @ColumnExpression IS NOT NULL
      BEGIN
        SET @ColumnList = @ColumnList
          + CASE WHEN @ColumnList != N'' THEN N',' ELSE N'' END
          + QUOTENAME(@ColumnName)
          + CASE WHEN @GenerateOneColumnPerLine = 1 THEN @CrLf ELSE N'' END;

        SET @SelectList = @SelectList
          + CASE WHEN @SelectList != N'' THEN N'+'',''+' + @CrLf ELSE N'' END
          + @ColumnExpression
          + CASE WHEN @UseColumnAliasInSelect = 1 AND @UseSelectSyntax = 1 THEN N'+'' ' + QUOTENAME(@ColumnName) + N'''' ELSE N'' END
          + CASE WHEN @GenerateOneColumnPerLine = 1 THEN N'+CHAR(13)+CHAR(10)' ELSE N'' END;
      END

      FETCH NEXT FROM ColumnCursor INTO @ColumnName,@DataType;
    END

    CLOSE ColumnCursor;
    DEALLOCATE ColumnCursor;

    IF NULLIF(@ColumnList,N'') IS NULL
    BEGIN
      RAISERROR(N'No columns to select.',16,1);
      RETURN -1;
    END

    IF @Debug = 1
    BEGIN
      PRINT(N'--Column list');
      PRINT(@ColumnList);
    END

    IF NULLIF(@OmittedColumnList,'') IS NOT NULL
      AND @ShowWarnings = 1
    BEGIN
      PRINT(N'--*************************');
      PRINT(N'--WARNING: The following columns have been omitted because of unsupported datatypes: ' + @OmittedColumnList);
      PRINT(N'--*************************');
    END

    IF @GenerateSingleInsertPerRow = 1
    BEGIN
      SET @SelectList = 
        N'''' + @InsertSql + N'''+' + @CrLf
        + CASE WHEN @FormatCode = 1
          THEN N'CHAR(13)+CHAR(10)+' + @CrLf
          ELSE N''' ''+'
          END
        + CASE WHEN @OmmitInsertColumnList = 1
          THEN N''
          ELSE N'''(' + @ColumnList + N')''+' + @CrLf
          END
        + CASE WHEN @FormatCode = 1
          THEN N'CHAR(13)+CHAR(10)+' + @CrLf
          ELSE N''' ''+'
          END
        + CASE WHEN @UseSelectSyntax = 1
          THEN N'''' + @SelectSql + N'''+'
          ELSE N'''' + @ValuesSql + N'''+'
          END
        + @CrLf
        + @SelectList
        + CASE WHEN @UseSelectSyntax = 1
          THEN N''
          ELSE N'+' + @CrLf + N''')'''
          END
        + CASE WHEN @GenerateStatementTerminator = 1
          THEN N'+'';'''
          ELSE N''
          END
        + CASE WHEN @GenerateGo = 1
          THEN N'+' + @CrLf + N'CHAR(13)+CHAR(10)+' + @CrLf + N'''GO'''
          ELSE N''
          END
      ;
    END ELSE BEGIN
      SET @SelectList =
        CASE WHEN @UseSelectSyntax = 1
          THEN N'''' + @SelectSql + N'''+'
          ELSE N'''(''+'
          END
        + @CrLf
        + @SelectList
        + CASE WHEN @UseSelectSyntax = 1
          THEN N''
          ELSE N'+' + @CrLf + N''')'''
          END
      ;
    END

    SET @SelectStatement = N'SELECT'
      + CASE WHEN NULLIF(@TopExpression,N'') IS NOT NULL
        THEN N' TOP ' + @TopExpression
        ELSE N'' END
      + @CrLf + @SelectList + @CrLf
      + N'FROM ' + @ObjectName
      + CASE WHEN NULLIF(@FunctionParameters,N'') IS NOT NULL
        THEN @FunctionParameters
        ELSE N'' END
      + CASE WHEN NULLIF(@SearchCondition,N'') IS NOT NULL
        THEN @CrLf + N'WHERE ' + @SearchCondition
        ELSE N'' END
      + CASE WHEN NULLIF(@OrderByExpression,N'') IS NOT NULL
        THEN @CrLf + N'ORDER BY ' + @OrderByExpression
        ELSE N'' END
      + @CrLf + N';' + @CrLf + @CrLf
    ;

    IF @Debug = 1
    BEGIN
      PRINT(@CrLf + N'--Select statement');
      PRINT(@SelectStatement);
    END

    INSERT INTO @TableData
    EXECUTE (@SelectStatement);

    IF @GenerateProjectInfo = 1
    BEGIN
      INSERT INTO @Results
      SELECT N'--INSERTs generated by GenerateInsert (Build 6)'
      UNION SELECT N''
    END

    IF @GenerateSetNoCount = 1
    BEGIN
      INSERT INTO @Results
      SELECT N'SET NOCOUNT ON'
    END

    IF @PopulateIdentityColumn = 1
    BEGIN
      INSERT INTO @Results
      SELECT N'SET IDENTITY_INSERT ' + COALESCE(@TargetObjectName,@ObjectName) + N' ON'
    END

    IF @GenerateSingleInsertPerRow = 1
    BEGIN
      INSERT INTO @Results
      SELECT TableRow
      FROM @TableData
    END ELSE BEGIN
      IF @FormatCode = 1
      BEGIN
        INSERT INTO @Results
        SELECT @InsertSql;

        IF @OmmitInsertColumnList != 1
        BEGIN
          INSERT INTO @Results
          SELECT N'(' + @ColumnList + N')';
        END

        IF @UseSelectSyntax != 1
        BEGIN
          INSERT INTO @Results
          SELECT N'VALUES';
        END
      END ELSE BEGIN
        INSERT INTO @Results
        SELECT @InsertSql
          + CASE WHEN @OmmitInsertColumnList = 1 THEN N'' ELSE N' (' + @ColumnList + N')' END
          + CASE WHEN @UseSelectSyntax = 1 THEN N'' ELSE N' VALUES' END
      END

      SET @RowNo = 0;
      DECLARE DataCursor CURSOR LOCAL FAST_FORWARD FOR
      SELECT TableRow
      FROM @TableData
      FOR READ ONLY
      ;
      OPEN DataCursor;
      FETCH NEXT FROM DataCursor INTO @TableRow;

      WHILE @@FETCH_STATUS = 0
      BEGIN
        SET @RowNo = @RowNo + 1;

        INSERT INTO @Results
        SELECT
          CASE WHEN @UseSelectSyntax = 1
          THEN CASE WHEN @RowNo > 1 THEN N'UNION' + CASE WHEN @FormatCode = 1 THEN @CrLf ELSE N' ' END ELSE N'' END
          ELSE CASE WHEN @RowNo > 1 THEN N',' ELSE N' ' END END
          + @TableRow;

        FETCH NEXT FROM DataCursor INTO @TableRow;
      END

      CLOSE DataCursor;
      DEALLOCATE DataCursor;

      IF @GenerateStatementTerminator = 1
      BEGIN
        INSERT INTO @Results
        SELECT N';';
      END

      IF @GenerateGo = 1
      BEGIN
        INSERT INTO @Results
        SELECT N'GO';
      END
    END

    IF @PopulateIdentityColumn = 1
    BEGIN
      INSERT INTO @Results
      SELECT N'SET IDENTITY_INSERT ' + COALESCE(@TargetObjectName,@ObjectName) + N' OFF'
    END

    IF @FormatCode = 1
    BEGIN
      INSERT INTO @Results
      SELECT N''; -- An empty line at the end
    END

    IF @PrintGeneratedCode = 1
    BEGIN
      DECLARE @LongRows bigint;
      SET @LongRows = (SELECT COUNT(*) FROM @Results WHERE LEN(TableRow) > 4000);

      IF @LongRows > 0
        AND @ShowWarnings = 1
      BEGIN
        PRINT(N'--*************************');
        IF @LongRows = 1
          PRINT(N'--WARNING: ' + CONVERT(nvarchar(max), @LongRows) + N' Row is very long and will be chopped at every 4000 character.')
        ELSE
          PRINT(N'--WARNING: ' + CONVERT(nvarchar(max), @LongRows) + N' Rows are very long and will be chopped at every 4000 character.');
        PRINT(N'-- If this is an issue then the workaround is to use @PrintGeneratedCode = 0 and output "Result to Grid" in SSMS.');
        PRINT(N'--*************************');
      END

      DECLARE ResultsCursor CURSOR LOCAL FAST_FORWARD FOR
      SELECT TableRow
      FROM @Results
      FOR READ ONLY
      ;
      OPEN ResultsCursor;
      FETCH NEXT FROM ResultsCursor INTO @TableRow;

      WHILE @@FETCH_STATUS = 0
      BEGIN

        DECLARE @CurrentEnd bigint; -- track the length of the next sub-string
        DECLARE @Offset tinyint; -- tracks the amount of offset needed
        SET @TableRow = REPLACE(REPLACE(@TableRow, CHAR(13) + CHAR(10), CHAR(10)), CHAR(13), CHAR(10));

        WHILE LEN(@TableRow) > 1
        BEGIN
          IF CHARINDEX(CHAR(10), @TableRow) BETWEEN 1 AND 4000
          BEGIN
            SET @CurrentEnd = CHARINDEX(CHAR(10), @TableRow) - 1;
            SET @Offset = 2;
          END
          ELSE
          BEGIN
            SET @CurrentEnd = 4000;
            SET @Offset = 1;
          END

          PRINT(SUBSTRING(@TableRow, 1, @CurrentEnd));
          SET @TableRow = SUBSTRING(@TableRow, @CurrentEnd + @Offset, LEN(@TableRow))   
        END

        FETCH NEXT FROM ResultsCursor INTO @TableRow;
      END

      CLOSE ResultsCursor;
      DEALLOCATE ResultsCursor;
    END ELSE BEGIN
      SELECT *
      FROM @Results;
    END

    END
    GO
----==============================
--ONCE SP Created run The following Code With Table_Name.. 


DECLARE @Name NVARCHAR(261)='Table_Name';
DECLARE TableCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT QUOTENAME(s.name) + '.' + QUOTENAME(t.name) ObjectName
FROM sys.tables t
  INNER JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name NOT LIKE 'sys%' AND t.name='Table_Name'
FOR READ ONLY
;
OPEN TableCursor;
FETCH NEXT FROM TableCursor INTO @Name;

WHILE @@FETCH_STATUS = 0
BEGIN
  EXECUTE dbo.GenerateInsert @ObjectName = @Name;

  FETCH NEXT FROM TableCursor INTO @Name;
END

CLOSE TableCursor;
DEALLOCATE TableCursor;
Sign up to request clarification or add additional context in comments.

5 Comments

For this You Need to Create A Dynamic Query with Union all which will allow you to insert all the Data.
I think you didn't quite understand my question. I know how to make a query. I want SSMS to make this query without repeated 'INSERT' statement
I Had Modify The ans Have a look.hope you will get your Desire Output
Thank you very much. This is already a step in a correct direction for me.
@Romczyk Welcome

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.