如何从SQL二进制字段获取单个字节

11

我在SQL Server中有一个二进制字段,想要在SQL函数中每次读取一个字节。如果是代码,我会使用一个字节数组。在SQL中有类似的吗?

我在谷歌上搜索了一下,但没有找到相关信息。

3个回答

15

SUBSTRING函数应该已经足够了。以下是一个快速的示例,假设有一个名为MyTable且包含列SomeData(二进制类型,长度为10)的表:

DECLARE
  @OneByte  binary(1)
 ,@Loop     int


SET @Loop = 0
WHILE @Loop < 10
 BEGIN
    SET @Loop = @Loop + 1

    SELECT @OneByte = substring(SomeData, @Loop, 1)
     from MyTable

    --  Process accordingly
 END

有更复杂的基于集合的方法来解决这个问题,但对于短值,这种方法应该已经足够了。


1
那么它会先将二进制转换为字符串,然后再执行子字符串操作吗?从性能的角度来看,这是最好的方式吗? - Le-roy Staines
2
根据 SQL 2008 的 Books Online 文档:如果表达式是受支持的字符数据类型之一,则返回字符数据;如果表达式是受支持的二进制数据类型之一,则返回二进制数据。返回的字符串与指定的表达式类型相同,但有表格中所示的例外。 - Philip Kelley
就性能而言,如果您有大量的数据需要转换,或者需要亚秒级的处理速度,确定一个理想的过程将需要大量的测试时间和精力。 - Philip Kelley
同意!但是无论我在哪里搜索,都使用了子字符串,所以在这个阶段我没有太多的测试选项 :) 我会继续寻找。 - Le-roy Staines
在SO上发布你的问题。我认为可能有更好的解决方案,可以使用计数表和交叉应用... - Philip Kelley

7
你可以使用SUBSTRING循环遍历二进制字段。
declare @BinaryColumn binary(5)

set @BinaryColumn = convert(binary,'abcde')

declare @Counter int, @ColumnLength int
set @Counter = 1
set @ColumnLength = LEN(@BinaryColumn)

while (@Counter <= @ColumnLength) begin
    select SUBSTRING(@BinaryColumn, @Counter, 1)
    set @Counter = @Counter + 1
end /* while */

3

Varbinary作为一种类型将表现为一个字节数组,您可以使用substring从中读取单个字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接