Как создать сценарий INSERT для таблицы с полем VARBINARY(MAX)?
У меня есть стол с VARBINARY(MAX)
поле (SQL Server 2008 с FILESTREAM
)
Мое требование заключается в том, чтобы при развертывании в производство я мог предоставить своей ИТ-команде только группу сценариев SQL, которые будут выполняться в определенном порядке. Новая таблица, которую я делаю в производстве, имеет это VARBINARY(MAX)
поле. Обычно с новыми таблицами я буду писать сценарий CREATE TABLE
скрипт. И, если у меня есть данные, которые мне нужны, я запишу INSERT
скрипты. Не слишком сложно.
Но с VARBINARY(MAX)
хранимая процедура, которую я использовал для генерации INSERT
заявления не на этой таблице. Я попытался выбрать это поле, распечатать его, скопировать, преобразовать в шестнадцатеричный формат и т. Д. Основная проблема, с которой я столкнулся, заключается в том, что он не выделяет все данные в поле. Я делаю проверку DATALENGTH([FileColumn])
и если исходная строка содержит 1 004 382 байта, максимум, что я могу получить скопированные или выбранные данные при повторной вставке, составляет 8000. Таким образом, в основном это усеченные (то есть недействительные) данные.....
Как я могу сделать это лучше? Я пытался погуглить это как сумасшедший, но я, должно быть, что-то упустил. Помните, я не могу получить доступ к файловой системе. Это должно быть все по сценарию.
4 ответа
Не сценарий из SSMS
bcp данные из / в, или использовать что-то вроде инструментов SSMS для генерации операторов INSERT
Если это делается один раз (или редко), вы можете попробовать записать данные из мастера SSMS, как описано здесь:
http://sqlblog.com/blogs/eric_johnson/archive/2010/03/08/script-data-in-sql-server-2008.aspx
Или, если вам нужно делать это часто и вы хотите автоматизировать это, вы можете попробовать библиотеку SQL # SQLCLR (которую я написал, и хотя большая ее часть бесплатна, нужной вам функции здесь нет). Функция для этого - DB_DumpData, и она также генерирует INSERT
заявления.
Но опять же, если это одноразовая или нечастая задача, попробуйте мастер экспорта данных, встроенный в Management Studio. Это должно позволить вам затем создать сценарий SQL, который вы сможете запустить в Production. Я только что проверил это на столе с VARBINARY(MAX)
поле, содержащее 3 365 964 байта данных, и мастер создания сценариев сгенерировал INSERT
оператор со всей шестнадцатеричной строкой из 6,73 миллионов символов для этого одного значения.
ОБНОВИТЬ:
Еще один быстрый и простой способ сделать это способом, который позволит вам скопировать / вставить весь оператор INSERT в сценарий SQL и не беспокоиться об использовании мастера экспорта BCP или SSMS, - просто преобразовать значение в XML
, Сначала вы бы CONVERT
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. Вот пример:
http://blogs.msdn.com/b/sqltips/archive/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa.aspx
Я не могу говорить лично о том, насколько это эффективно или продуктивно, особенно для больших ценностей. Поскольку в лучшем случае это хакерский хак, я бы где-нибудь спрятал его в UDF, чтобы, если был найден лучший метод, вы могли легко его обновить.
Я никогда не пробовал ничего подобного раньше, но из документации по SQL Server 2008 R2 кажется, что использование SUBSTRING будет работать для получения всего значения varbinary, хотя вам, возможно, придется работать с ним порциями, используя UPDATE с. ЗАПИСЬ предложение для добавления данных.
Обновление типов данных с большим значением
Используйте условие.WRITE (expression, @Offset, @Length) для частичного или полного обновления типов данных varchar(max), nvarchar(max) и varbinary(max). Например, частичное обновление столбца varchar (max) может удалить или изменить только первые 200 символов столбца, тогда как полное обновление приведет к удалению или изменению всех данных в столбце.
Для достижения наилучшей производительности мы рекомендуем вставлять или обновлять данные с размерами блоков, кратными 8040 байтам.
Надеюсь это поможет.