代码之家  ›  专栏  ›  技术社区  ›  CubanX

是否从单个表或SQL Server 2005/8中的所有表中编写所有数据的脚本?

  •  3
  • CubanX  · 技术社区  · 15 年前

    这里有一个简单的问题,我知道有很多笨拙的方法可以做到。)

    但是我希望一个SQL Server专家有一个脚本可以轻松地将所有数据从表中脚本化?或者可能是数据库中的所有表?

    我厌倦了在RDC上复制和粘贴数据!:)

    5 回复  |  直到 14 年前
        1
  •  6
  •   John Gietzen    15 年前

    我也有类似的要求。

    为表中的每一行编写INSERT语句脚本。有时我需要身份栏,有时我不需要。

    所以,我写了:

    CREATE PROCEDURE [dbo].[GenerateInsertScripts] (
        @tableName varchar(100),
        @tableSchema varchar(50) = 'dbo',
        @skipIdentity bit = 1
    )
    AS
    BEGIN
        DECLARE @columnName varchar(800)
        DECLARE @columnType varchar(20)
        DECLARE @statementA varchar(MAX)
        DECLARE @statementB varchar(MAX)
        DECLARE @statement nvarchar(MAX)
        DECLARE @isIdentity bit
        DECLARE @commaFlag bit
    
        SET @statementA = 'INSERT INTO [' + @tableSchema + '].[' + @tableName + '] ('
        SET @statementB = ''' + '
    
        DECLARE cols CURSOR FOR
        SELECT
            COLUMN_NAME,
            DATA_TYPE,
            (SELECT COLUMNPROPERTY(OBJECT_ID('[' + @tableSchema + '].[' + @tableName + ']'),
            information_schema.columns.COLUMN_NAME, 'IsIdentity')) AS IsIdentity
        FROM
            information_schema.columns
        WHERE
            TABLE_NAME = @tableName
          AND
            TABLE_SCHEMA = @tableSchema
        ORDER BY
            ORDINAL_POSITION
    
        OPEN cols
        FETCH cols INTO @columnName, @columnType, @isIdentity 
        SET @commaFlag = 0
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF NOT (@isIdentity = 1 AND @skipIdentity = 1) BEGIN
            IF @commaFlag = 1 BEGIN
                SET @statementA = @statementA + ', '
                SET @statementB = @statementB + ' + '', '' + '
            END
            SET @commaFlag = 1
    
            SET @statementA = @statementA + '[' + @columnName + ']'
            SET @statementB = @statementB + 'CASE WHEN [' + @columnName + '] IS NULL THEN ''NULL'' ELSE ' + 
            CASE
                WHEN @columnType = 'bigint' OR @columnType = 'int' OR @columnType = 'tinyint' OR @columnType = 'bit' THEN
                    'CAST([' + @columnName + '] AS varchar(MAX))'
                WHEN @columnType = 'datetime' THEN
                    ''''''''' + CONVERT(varchar, [' + @columnName + '], 121) + '''''''''
                ELSE
                    ''''''''' + REPLACE(CAST([' + @columnName + '] AS varchar(MAX)), '''''''', '''''''''''') + '''''''''
            END
    
             + ' END'
            END
        FETCH cols INTO @columnName, @columnType, @isIdentity
        END
        SET @commaFlag = 0
        CLOSE cols
        DEALLOCATE cols
    
        SET @statementB = @statementB + ' + '''
    
        SET @statement = 'SELECT ''' + @statementA + ') VALUES (' + @statementB + ')'' [Statement] FROM [' + @tableSchema + '].[' + @tableName + ']'
    
        EXEC sp_executesql @statement
    END
    
        2
  •  3
  •   KM.    15 年前

    使用这个伟大的脚本:

    http://vyaskn.tripod.com/code.htm#inserts

    但这是一种糟糕的数据移动方式,有助于解决问题或移动少量测试数据等。

        3
  •  0
  •   HLGEM    15 年前

    如果要将数据移动到不同的数据库或某种文件,请使用ssis。如果任务不复杂,请使用向导,右键单击数据库名称,转到taks并选择导出数据。

    如果要对整个数据库进行操作,另一种方法是只在另一个位置恢复最新的备份。

        4
  •  0
  •   Michel de Ruiter    14 年前

    对于SQL Server 2008,可以使用 Script Data 生成脚本向导中的选项。但2005年不行。

    可以通过在SSMS中的对象资源管理器中右键单击数据库来启动向导,然后 Tasks -gt; Generate Scripts... .

        5
  •  0
  •   Christian Specht    14 年前

    对于SQL Server 2005,可以使用 Database Publishing Wizard 来自微软。