Sql server SQL Server:如何从二进制或varbinary值中的字节提取特定位

Sql server SQL Server:如何从二进制或varbinary值中的字节提取特定位,sql-server,bit-manipulation,bit,Sql Server,Bit Manipulation,Bit,我有varbinary值,我想提取第0字节的前3位,然后 值为0x4D79205465747420537472696E67 谢谢,这将从varbinary值的第一个字节中提取3位: select CONVERT(tinyint,0x7) & SUBSTRING(0x4D79205465737420537472696E67,1,1) 逻辑是在AND(&)的左侧,我们有一个设置了3位的字节。在右侧,我们从varbinary中提取一个字节(基于1而不是0,因此这是第一个字节) 要从第3个字节

我有varbinary值,我想提取第0字节的前3位,然后 值为0x4D79205465747420537472696E67


谢谢,

这将从
varbinary
值的第一个字节中提取3位:

select CONVERT(tinyint,0x7) & SUBSTRING(0x4D79205465737420537472696E67,1,1)
逻辑是在AND(
&
)的左侧,我们有一个设置了3位的字节。在右侧,我们从
varbinary
中提取一个字节(基于1而不是0,因此这是第一个字节)

要从第3个字节中提取最后5位,我们需要:

select CONVERT(tinyint,0xF8) & SUBSTRING(0x4D79205465737420537472696E67,3,1)

可以在varbinary上执行子字符串吗?如果是这样,每个字节都算作一个字符?@GuillermoGutiérrez-I链接到它的文档。我不会说每个字节都算作一个字符。相反,它是用字节而不是字符来显式定义的:“对于ntext、char或varchar数据类型,必须用字符数指定start和length的值,对于text、image、binary或VARBINAL数据类型,必须用字节数指定。”我试过UDF如下:ALTER FUNCTION[dbo].[GetByte](BinaryData-varbinary(MAX),ByteIndex int,Index int)返回varchar(50)作为BEGIN--declare BinaryColumn binary(5)--set BinaryColumn=convert(binary,BinaryData)declare Ret varchar(20)select Ret=SUBSTRING(BinaryData,ByteIndex,1)Ret Ret enddocco建议您所做的是正确的,但尝试第二次选择(第三字节的5位)返回0。@NeilMoss-那是因为我是一个木偶,忘记了我应该用十六进制而不是十进制指定常量。现在更正常量(并实际运行它)。