临时表##FlowExecution查询指定CustomerIdHash无结果求助
遇到这种明明能看到数据但精准匹配查不到的情况,大概率是二进制类型处理或者显示层面的问题,我给你列几个常见的排查方向:
数据类型不匹配导致隐式转换出错
看你的CustomerIdHash值是0x开头的,大概率这个字段的类型是varbinary(二进制类型)。你查询的时候用了单引号把值包起来,这就变成了字符串常量,SQL Server会尝试把这个字符串隐式转换成varbinary类型再去匹配,但这个转换过程可能和实际存储的二进制值不一致。正确的做法是去掉单引号,直接用二进制常量查询:select top 10 * from ##FlowExecution where CustomerIdHash = 0x913DF790B957B42A9867F3491E9B8C919F81B64DC1812FDDECB9F919DB15A5D1工具显示的二进制值被截断
比如你用SSMS(SQL Server Management Studio)查询时,如果CustomerIdHash的长度超过了工具默认的显示长度,SSMS会自动截断显示的内容,你复制的只是截断后的部分,自然匹配不上完整的存储值。可以先执行下面的语句,把二进制值转换成完整的十六进制字符串再查看:select top 10 CustomerIdHash, CONVERT(varchar(max), CustomerIdHash, 2) as FullCustomerIdHash from ##FlowExecution这里的
2参数会返回不带0x前缀的完整十六进制字符串,你复制这个字符串,然后用下面的方式查询(记得加0x前缀且不带单引号):select top 10 * from ##FlowExecution where CustomerIdHash = 0x[你复制的完整十六进制字符串]确认临时表的字段定义
先确认CustomerIdHash的具体数据类型,避免因为类型误解导致的问题,执行下面的语句查看字段信息:SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE '%##FlowExecution%'如果字段是
varchar而不是varbinary,那你需要确认存储的是带0x前缀的字符串还是不带,这时候查询就要用单引号包裹准确的字符串值。排查数据是否被修改
虽然概率较低,但全局临时表##FlowExecution是所有会话可见的,如果在你查询top10和执行条件查询之间,有其他会话删除或修改了那条数据,也会导致查不到结果。可以重新执行select top 10 * from ##FlowExecution确认目标数据是否还存在。
内容的提问来源于stack exchange,提问作者disasterkid

