SQL Server比较varchar字段和二进制(16)

时间:2014-08-11 13:37:14

标签: sql sql-server sql-server-2005

我有2个表 - 表A具有二进制(16)类型的主键列,另一个表B使用外键引用同一列但数据类型为varchar(50)。因此,表A的值为0x0007914BFFEC4603A6900045492EFA1A,表B的值存储为0007914BFFEC4603A6900045492EFA1A

我如何比较这两列,这将给我

0007914BFFEC4603A6900045492EFA1A = 0x0007914BFFEC4603A6900045492EFA1A

4 个答案:

答案 0 :(得分:1)

您需要将二进制(16)转换为字符串。有关如何执行此操作的示例,请参阅以下问题。此问题将varbinary转换为字符串,但相同的技术可用于二进制列或变量:

SQL Server converting varbinary to string

如何执行此操作的示例代码如下:

declare @bin binary(16), @str varchar(50)
set @bin = 0x0007914BFFEC4603A6900045492EFA1A
set @str = '0007914BFFEC4603A6900045492EFA1A'

select @bin as'binary(16)', @str as 'varchar(50)'

-- the binary value is not equal to the string value
-- this statement returns 'binary value is not equal to string'
if @bin = @str select 'binary value is equal to string'
else select 'binary value is not equal to string'

declare @binstr varchar(50)
select @binstr = convert(varchar(50), @bin, 2)
select @binstr

-- the converted string value matches the other string
-- the result of this statement is "converted string is equal"
if @binstr = @str select 'converted string is equal'
else select 'converted string is NOT equal'

要在联接中使用此功能,您可以在内部联接的ON子句或WHERE子句中包含转换:

select *
from TableA
inner join TableB
    on TableB.char_fk = convert(varchar(50), TableA.bin_pk, 2)

<强>更新

对于SQL Server 2005,您可以使用XML方法shown by Peter Larsson here

-- Prepare value
DECLARE @bin VARBINARY(MAX)
SET     @bin = 0x5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

-- Display the results
SELECT @bin AS OriginalValue,
        CAST('' AS XML).value('xs:hexBinary(sql:variable("@bin"))', 'VARCHAR(MAX)') AS ConvertedString

您也可以使用未记录的函数sys.fn_varbintohexstr,但作为this post on dba.stackexchange.com explains,有几个原因可以避免它。

答案 1 :(得分:0)

带有样式2的

CONVERT以获得十六进制字符串的二进制表示形式;

... where TableA.bin_pk = CONVERT(VARBINARY, TableB.char_fk, 2) 

答案 2 :(得分:0)

正确的方法是将两个字段设置为相同的数据类型。为了做到这一点,创建一个新表说temp并使用select into和convert:

select field1,...,convert(varchar(50),varbinary(16),fieldToConvert)...,fieldN

into myNewTable

答案 3 :(得分:0)

找到答案。我需要使用

master.dbo.fn_varbintohexstr (@source) 

将varbinary转换为varchar,然后在我的场景中完美地进行比较。