如何为具有VARBINARY(MAX)字段的表生成INSERT脚本?

我有一个带有
VARBINARY(MAX)
字段的表(SQL Server 2008 with
FILESTREAM
) 我的要求是,当我去部署到生产时,我只能为我的IT团队提供一组SQL脚本,以便按特定顺序执行。我正在制作的新表有这个
VARBINARY(MAX)
字段。通常使用新表格,我会编写
CREATE TABLE
脚本。而且,如果我有数据,我需要使用它,然后我将编写
INSERT
脚本。不太复杂。 但是使用
VARBINARY(MAX)
,我用来生成
INSERT
语句的存储过程在该表上失败。我尝试选择该字段,打印,复制,转换为十六进制等。我遇到的主要问题是它没有选择字段中的所有数据。我做了一个检查
DATALENGTH([FileColumn])
,如果源行包含1,004,382字节,那么当我再次插入时,我可以获得复制或选择数据的最大值是8000.所以基本上它被截断(即无效)数据..... 我怎么能做得更好?我试着用谷歌搜索疯狂,但我必须遗漏一些东西。请记住,我无法访问文件系统。这必须全部编写脚本。     
已邀请:
不要从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中内置的数据导出向导。这应该允许您创建可以在Production中运行的SQL脚本。我刚刚在一个包含3,365,964字节数据的
VARBINARY(MAX)
字段的表上进行了测试,Generate Scripts向导生成了一个
INSERT
语句,其中包含673万字符的整个十六进制字符串。 更新: 另一种快速简便的方法是,允许您将整个INSERT语句复制/粘贴到SQL脚本中,而不必费心使用BCP或SSMS导出向导,只需将值转换为
XML
即可。首先,你使用可选的“1”样式
CONVERT
VARBINARY
VARCHAR(MAX)
,它给你一个以“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一起使用它。附加数据的子句。   更新大值数据类型      使用.WRITE(expression,@ Offset,@ Length)子句执行varchar(max),nvarchar(max)和varbinary(max)数据类型的部分或完全更新。例如,varchar(max)列的部分更新可能仅删除或修改列的前200个字符,而完整更新将删除或修改列中的所有数据。      为获得最佳性能,我们建议以8040字节倍数的块大小插入或更新数据。 希望这可以帮助。     

要回复问题请先登录注册