2011-04-12 61 views
7

我有一个VARBINARY(MAX)字段的表(带有FILESTREAM的SQL Server 2008)如何为具有VARBINARY(MAX)字段的表生成插入脚本?

我的要求是,当我去部署prod时,我只能向我的IT团队提供一组SQL脚本按一定顺序执行。我在制作的新表中有这个VARBINARY(MAX)字段。通常使用新表格,我将编写CREATE TABLE脚本。如果我有需要的数据,我将使用INSERT脚本编写脚本。不太复杂。

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

我该如何做得更好?我试图Google疯狂搜索,但我必须错过一些东西。请记住,我无法访问文件系统。必须全部脚本化。

回答

5

不要从SSMS

bcp数据输出/输入脚本,或使用类似SSMS tools生成的INSERT语句

+0

SSMS工具真棒!它完成了这项工作。谢谢 – 2011-04-12 13:11:48

0

我以前从来没有尝试过这样的事情,但从SQL Server 2008 R2的文档中,听起来像使用SUBSTRING将工作以获取整个varbinary值,尽管您可能必须使用大块工作,使用UPDATE用.WRITE子句添加数据。

更新大值数据类型

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

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

希望这会有所帮助。

+0

你能否提供更多的细节?感谢迄今为止所有的帮助。 – 2011-04-12 03:40:43

+0

@Issa Fram,我不确定你是如何生成脚本的,但是你可以尝试使用'SUBSTRING'和'DATALENGTH'来获得整个varbinary值。如果这在你的脚本中工作并产生一个可用的插入语句,那么你就完成了。如果没有,你可以尝试使用一个循环来获取varbinary数据块(比如说8040字节),并创建更新语句来将这些块写入目标行。但希望使用'SUBSTRING'来获得整个价值将工作。 – 2011-04-12 04:28:21

3

如果这是一次(或很少)的事情,你可以尝试从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中的数据导出向导。这应该允许您创建可以在Production中运行的SQL脚本。我只是在一个包含3,365,964个字节的数据的VARBINARY(MAX)字段的表上测试了这一点,并且Generate Scripts向导生成了一个INSERT语句,该语句的整个十六进制字符串为该值的673万字符。

编辑:
另一种快速简便的方法的方式,将允许你拷贝/整个INSERT语句粘贴到SQL脚本,并没有与BCP或SSMS打扰导出向导是只转换为做到这一点对XML的价值。首先,您将使用“1”的可选样式将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

它多一点搞砸了,但在过去,在网络上我已经看到了这个使用base64编码字符串来完成。您使用xml值来包装字符串,并从那里您可以将其转换为varbinary。这里有一个例子:
http://blogs.msdn.com/b/sqltips/archive/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa.aspx

我不能亲自谈论这是如何有效或高性能,但是,尤其是对于大值。因为它至多是一个丑陋的黑客攻击,所以我会将它放在UDF的某个地方,这样如果找到了更好的方法,就可以轻松更新它。

相关问题