Сценарий всех данных из одной таблицы или всех таблиц в Sql Server 2005/8? - PullRequest
3 голосов
/ 05 июня 2009

Простой вопрос, и я знаю, что есть много хитрых способов сделать это:)

Но я надеялся, что у эксперта по SQL-серверу был скрипт, который бы легко выводил все данные из таблицы? Или, возможно, все таблицы в БД?

Я устал от копирования и вставки данных через RDC! :)

Ответы [ 5 ]

6 голосов
/ 05 июня 2009

У меня было похожее требование.

Чтобы скрипт вставлял операторы для каждой строки в таблице. Иногда мне требовался столбец «Идентичность», а иногда нет.

Итак, я написал это:

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
3 голосов
/ 05 июня 2009

используйте этот замечательный скрипт:

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

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

0 голосов
/ 31 августа 2010

Для SQL Server 2005 вы можете использовать бесплатный Мастер публикации баз данных от Microsoft.

0 голосов
/ 31 августа 2010

Для SQL Server 2008 вы можете использовать параметр Script Data в мастере создания сценариев. Но не на 2005 год.

Вы можете запустить мастер, щелкнув правой кнопкой мыши базу данных в обозревателе объектов в SSMS, а затем Tasks -> Generate Scripts....

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

Если вы перемещаете данные в другую базу данных или в какой-либо файл, используйте SSIS. Если задача не сложная, воспользуйтесь мастером, щелкните правой кнопкой мыши на имени базы данных, перейдите к тактам и выберите Экспорт данных.

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

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