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

时间:2011-04-12 03:13:07

标签: sql-server tsql sql-server-2008 varbinary sqlfilestream

我有一个带有VARBINARY(MAX)字段的表(SQL Server 2008带有FILESTREAM

我的要求是,当我开始部署到生产环境时,我只能为我的IT团队提供一组SQL脚本,以便按特定顺序执行。我正在制作的新表有VARBINARY(MAX)字段。通常使用新表,我将编写CREATE TABLE脚本的脚本。而且,如果我需要数据,我将编写INSERT脚本。不太复杂。

但是对于VARBINARY(MAX),我用来生成INSERT语句的存储过程在该表上失败。我尝试选择该字段,打印,复制,转换为十六进制等。我遇到的主要问题是它没有选择字段中的所有数据。我做了一个检查DATALENGTH([FileColumn]),如果源行包含1,004,382个字节,那么当再次插入时,我可以获得复制或选择的数据的最大值是8000.所以基本上它被截断(即无效)数据..... < / p>

我怎样才能更好地做到这一点?我试着用谷歌搜索疯狂,但我必须遗漏一些东西。请记住,我无法访问文件系统。这必须全部编写脚本。

4 个答案:

答案 0 :(得分:5)

如果这是一次(或很少)的事情,您可以尝试从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;

答案 1 :(得分:5)

不要从SSMS编写脚本

bcp数据输出/或使用SSMS tools之类的内容生成INSERT语句

答案 2 :(得分:1)

它有点混乱,但在过去和网络上我看到这使用base64编码的字符串完成。您使用xml值来包装字符串,然后您可以将其转换为varbinary。这是一个例子:
http://blogs.msdn.com/b/sqltips/archive/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa.aspx

我不能亲自谈论这是多么有效或高效,特别是对于大价值。因为它最好是一个丑陋的黑客,我会把它藏在某个UDF里面,所以如果找到一个更好的方法,你可以轻松更新它。

答案 3 :(得分:0)

我以前从未尝试过这样的事情,但是从SQL Server 2008 R2的文档来看,听起来好像使用SUBSTRING将获得整个varbinary值,尽管你可能需要在块中使用它,使用带有.WRITE子句的UPDATE来附加数据。

  

更新大值数据类型

     

使用.WRITE(expression,@ Offset,@ Length)子句执行varchar(max),nvarchar(max)和varbinary(max)数据类型的部分或完全更新。例如,varchar(max)列的部分更新可能只删除或修改列的前200个字符,而完整更新将删除或修改列中的所有数据。

     

为了获得最佳性能,我们建议以8040字节倍数的块大小插入或更新数据。

希望这有帮助。