Iss*_*ram 12 t-sql sql-server varbinary sql-server-2008 sqlfilestream
我有一个VARBINARY(MAX)
字段的表(SQL Server 2008 FILESTREAM
)
我的要求是,当我去部署到生产时,我只能为我的IT团队提供一组SQL脚本,以便按特定顺序执行.我正在制作的新表有这个VARBINARY(MAX)
领域.通常使用新表,我会编写CREATE TABLE
脚本脚本.而且,如果我有数据,我需要使用它,然后我将编写INSERT
脚本脚本.不太复杂.
但是VARBINARY(MAX)
,我用来生成INSERT
语句的存储过程在该表上失败了.我尝试选择该字段,打印,复制,转换为十六进制等.我遇到的主要问题是它没有选择字段中的所有数据.我做了一个检查DATALENGTH([FileColumn])
,如果源行包含1,004,382字节,那么当我再次插入时,我可以获得复制或选择的数据的最大值是8000.所以基本上它是截断的(即无效的)数据.....
我怎么能做得更好?我试着像疯了一样搜索谷歌但我必须遗漏一些东西.请记住,我无法访问文件系统.这必须全部编写脚本.
如果这是一次(或很少)要做的事情,则可以尝试按如下所述从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字节数据的字段的表上进行了测试,并且Generate Scripts向导生成了一个INSERT
语句,该语句的整个十六进制字符串为673万个字符。
更新:以
一种允许您将整个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;
Run Code Online (Sandbox Code Playgroud)