12

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

我的要求是,当我去部署到生产中时,我只能为我的 IT 团队提供一组 SQL 脚本,按一定的顺序执行。我在生产中制作的一张新表有这个VARBINARY(MAX)字段。通常对于新表,我会编写CREATE TABLE脚本。而且,如果我有需要处理的数据,我将编写INSERT脚本。不太复杂。

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

我怎样才能做得更好?我像疯了一样尝试谷歌搜索,但我一定错过了一些东西。请记住,我无法访问文件系统。这必须全部脚本化。

4

4 回答 4

6

如果这是一次性(或很少)要做的事情,您可以尝试从 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 脚本。我刚刚在一个VARBINARY(MAX)包含 3,365,964 字节数据的字段的表上对此进行了测试,生成脚本向导为该值生成了一个包含 673INSERT万个字符的整个十六进制字符串的语句。

更新:
另一种快速简便的方法是,允许您将整个 INSERT 语句复制/粘贴到 SQL 脚本中,而不必使用 BCP 或 SSMS 导出向导,只需将值转换为XML. 首先,您将CONVERT使用VARBINARYVARCHAR(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;
于 2011-04-12T04:08:22.737 回答
5

不要从 SSMS 编写脚本

bcp数据输出/输入,或使用SSMS 工具之类的工具生成 INSERT 语句

于 2011-04-12T05:04:32.357 回答
1

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

不过,我不能亲自谈论这是多么有效或高效,尤其是对于大值。因为它充其量是一个丑陋的黑客,我会把它藏在 UDF 的某个地方,这样如果找到更好的方法,你可以轻松地更新它。

于 2011-04-12T04:19:29.500 回答
0

我以前从未尝试过这样的事情,但从 SQL Server 2008 R2 的文档来看,听起来使用SUBSTRING可以获取整个 varbinary 值,尽管您可能必须使用UPDATE和 . WRITE 子句追加数据。

更新大值数据类型

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

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

希望这可以帮助。

于 2011-04-12T03:34:12.160 回答