Как создать скрипт вставки для таблицы с полем VARBINARY(MAX)?

У меня есть таблица с полем VARBINARY (MAX) (SQL Server 2008 с FILESTREAM)

мое требование заключается в том, что когда я иду развертывать в prod, я могу предоставить своей ИТ-команде только группу сценариев SQL, которые будут выполняться в определенном порядке. Новая таблица, которую я делаю в производстве, имеет это поле VARBINARY(MAX). Обычно с новыми таблицами я буду выписывать сценарий CREATE TABLE script. И если у меня есть данные, мне нужно пойти с ним, я затем выпишу сценарии вставки. Не слишком сложный.

но с VARBINARY (MAX) хранимая процедура, которую я использовал для создания инструкций insert, терпит неудачу в этой таблице. Я попытался выбрать это поле, распечатать его, скопировать, преобразовать в hex и т. д. Основная проблема, с которой я имею дело, заключается в том, что он не выбирает все данные в поле. Я делаю проверку DATALENGTH ([FileColumn]), и если исходная строка содержит значение 1004382, Макс.я могу получить скопированные или выбранные данные при повторной вставке-8000. Так что в основном это усеченные, т. е. недопустимые данные.....

Как я могу сделать это лучше? Я попытался погуглить это как сумасшедший, но я, должно быть, что-то пропустил. Помните, я не могу получить доступ к файловой системе. Все должно быть по сценарию.

4 ответов


Не скрипт из SSMS

bcp данные out / in, или использовать что-то вроде инструменты SSMS для генерации инструкций INSERT


Если это один раз (или редко), вы можете попробовать создать сценарий данных из Мастера SSMS, как описано здесь:

http://sqlblog.com/blogs/eric_johnson/archive/2010/03/08/script-data-in-sql-server-2008.aspx

или, если вам нужно делать это часто и хотите автоматизировать его, вы можете попробовать библиотеку SQL# (которую я написал, и хотя большая часть ее бесплатна, функция вам здесь не нужна). Функция для этого-DB_DumpData и она также генерирует инструкции INSERT. Библиотека находится по адресу:http://www.SQLsharp.com/.

но опять же, если это однократная или нечастая задача, попробуйте мастер экспорта данных, встроенный в Management Studio. Это должно позволить вам создать сценарий SQL, который вы можете запустить в производстве. Я только что протестировал это на таблице с полем VARBINARY (MAX), содержащим 3,365,964 байта данных, и мастер создания сценариев сгенерировал инструкцию INSERT с помощью вся шестнадцатеричная строка из 6,73 миллиона символов для этого значения.

изменить:
Еще один быстрый и простой способ сделать это таким образом, чтобы вы могли скопировать / вставить всю инструкцию INSERT в сценарий SQL и не беспокоиться о Мастере экспорта BCP или SSMS, - это просто преобразовать значение в XML. Сначала вы преобразуете VARBINARY в VARCHAR (MAX), используя необязательный стиль "1", который дает вам шестнадцатеричную строку, начинающуюся с "0x". Как только у вас есть шестнадцатеричная строка двоичного файла данные вы можете объединить это в оператор INSERT, и вся эта вещь при преобразовании в XML может содержать все поле VARBINARY. Рассмотрим следующий пример:

DECLARE @Binary VARBINARY(MAX) = CONVERT(VARBINARY(MAX),
                                         REPLICATE(
                                           CONVERT(NVARCHAR(MAX), 'test string'),
                                           100000)
                                        )

SELECT 'INSERT INTO dbo.TableName (ColumnName) VALUES ('+
       CONVERT(VARCHAR(MAX), @Binary, 1) + ')' AS [Insert]
FOR XML RAW

Это более чем немного испорчено, но в прошлом и в Интернете я видел, как это делается с помощью строки с кодировкой base64. Вы используете значение xml, чтобы обернуть строку, и оттуда вы можете преобразовать ее в varbinary. Вот example:
http://blogs.msdn.com/b/sqltips/archive/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa.aspx

Я не могу лично говорить о том, насколько это эффективно или эффективно, особенно для больших значений. Потому что это в лучшем случае уродливый Хак, я бы спрятал его внутри UDF где-нибудь, так что, если будет найден лучший метод, вы можете легко его обновить.


Я никогда не пробовал ничего подобного раньше, но из документации для SQL Server 2008 R2 это звучит как использование подстрока будет работать, чтобы получить все значение varbinary, хотя вам, возможно, придется работать с ним кусками, используя обновлениеs со .Предложение WRITE для добавления данных.

Обновление Типов Данных Больших Значений

использовать .Предложение WRITE (expression, @Offset, @Length) для выполнения частичного или полное обновление типов данных varchar(max), nvarchar(max) и varbinary (max). Например, частичное обновление столбца varchar (max) может удалить или изменить только первые 200 символов столбца, в то время как полное обновление удалит или изменит все данные в столбце.

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

надеюсь, что это помогает.