2013-02-22 80 views
0

如果在运行时指定了长度(例如,在存储过程中),那么创建类型为varbinary(max)的二进制零串的最优雅方式是什么?创建一个长度可变的零的二进制字符串

我可以使用REPLICATE功能做到这一点,但是这涉及到很多铸件:

CAST(REPLICATE(CAST(CAST(0 AS tinyint) AS varbinary(max)), @size) 
    AS varbinary(max)) 

(它甚至不适合就行了...)有没有更好的方式来做到这一点?

编辑:该代码应适用于@size > 8000

+0

也许在一个函数中包装你的表达来隐藏细节。 – 2013-02-23 04:22:04

回答

0

原始形式

CAST(REPLICATE(CAST(CAST(0 AS tinyint) AS varbinary(max)), @size) 
    AS varbinary(max)) 

仍然适合我的需要最好的。

0

更好还是更短? :)

declare @size int 
set @size = 3 


select CAST(REPLICATE(CAST(CAST(0 AS tinyint) AS varbinary(max)), @size) AS varbinary(max)), 
     cast(replace(space(@size), ' ', 0x0) as varbinary(max)) 
+0

对不起,忘了提及一个关键要求 - 'SPACE'不会产生超过8000个字符... – krlmlr 2013-02-23 00:16:39

0
; with Foo as (
    select 1 as Size 
    union all 
    select Size * 2 
    from Foo 
    where Size < 65536) 
    select Size, Cast(Replicate(Char(0), Size) as VarBinary(MAX)) as WideZero 
    from Foo 
    option (maxrecursion 0)