我有2个表 - 表A具有二进制(16)类型的主键列,另一个表B使用外键引用同一列但数据类型为varchar(50)。因此,表A的值为0x0007914BFFEC4603A6900045492EFA1A
,表B的值存储为0007914BFFEC4603A6900045492EFA1A
。
我如何比较这两列,这将给我
0007914BFFEC4603A6900045492EFA1A = 0x0007914BFFEC4603A6900045492EFA1A
答案 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)
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,然后在我的场景中完美地进行比较。