Sql server 比较sql server 2008 r2中同时包含字母和数字的字段

Sql server 比较sql server 2008 r2中同时包含字母和数字的字段,sql-server,tsql,sql-server-2008,comparison,Sql Server,Tsql,Sql Server 2008,Comparison,我对T-SQL的编码相当陌生,遇到了一个我还没有找到并回答的问题。我希望这里的专家告诉我哪里出了问题 我试图将两列序列号与not in语句进行比较,如果列中只有数字,则效果很好,但如果序列号中有字母,则只会回退所有记录,而不仅仅是不在第二个表中的记录。下面是我的问题,我希望有人能指出我做错了什么。先谢谢你 @Transaction varchar (50) AS SET NOCOUNT ON; SELECT transaction, equiptype, serialn

我对T-SQL的编码相当陌生,遇到了一个我还没有找到并回答的问题。我希望这里的专家告诉我哪里出了问题

我试图将两列序列号与not in语句进行比较,如果列中只有数字,则效果很好,但如果序列号中有字母,则只会回退所有记录,而不仅仅是不在第二个表中的记录。下面是我的问题,我希望有人能指出我做错了什么。先谢谢你

@Transaction varchar (50)

AS

    SET NOCOUNT ON;

SELECT       transaction, equiptype, serialnum

FROM             table1

WHERE           ( serialnum NOT IN
        (SELECT serial_num
                      FROM   table2 ) AND transaction = @Transaction)
p.S.a是我过滤记录的交易编号

表1- 表2-
基于此数据,事务12345678将只返回最后一条带有serialnum 46259的记录,这很好,但如果我尝试对事务87654321执行相同操作,它将返回所有记录,就像NOT IN STATION无法运行一样,而不是序列号143

我认为这个查询可以帮助您

declare @Transaction varchar(50)
set @Transaction='something'

select table1.a,table1.b,table1.c ,table2.d 
from table1 
left join table2 
  on table1.b=table2.d 
where table2.d is null 
  and table1.a=@Transaction

可能是来自服务器排序规则。请试一试

SELECT TRANSACTION, equiptype, serialnum
FROM table1
WHERE  (serialnum  COLLATE SQL_Latin1_General_CP1_CI_AS  
        NOT IN (SELECT serial_num  COLLATE SQL_Latin1_General_CP1_CI_AS FROM table2 ) 
    AND TRANSACTION = @Transaction)

谢谢你的回复,Tsachi,我确实尝试过左外连接,不幸的是,它仍然会回退任何带有字母的字段,不管它是否在表2中。我已经检查了我的列,它们是varchar(50),两个列都是由同一个程序输入的,所以语言格式不应该是一个问题。这一个真的让我很困惑。我的意思是一个左撇子加入我的道歉我尝试了你在你的例子中显示的内容,但仍然有相同的结果。我没有收到错误消息,它看起来运行正常,但如果序列号中有字母,它将返回该交易号的所有记录,而不仅仅是表2中没有的记录。如果您可以为表
table1
table2
提供一些示例数据,这些数据将显示您的问题。我将编辑上面的帖子,以包含示例数据,我希望这会有所帮助。既然您现在添加了表示例,您能否编辑问题中的SQL,使其与表相关?我看到a、b、c和d列,如果您根据您的示例用正确的列名替换这些列名,您的问题将更容易理解。很抱歉,我已更正查询以反映示例数据表1和表2中[serial_num]的数据类型是什么?EricZ,我更改了我的查询以匹配您文章中的查询,但现在我收到一个错误,显示Msg 248,级别16,状态1,过程InvCompare,第5行varchar值“2455768137550020”的转换溢出了一个int列。这两个表中唯一的int列是我的索引列,所以我不确定这是如何实现的。听起来像是您的查询首先通过转换为int来比较VARCHAR列。您可以检查值“2455768137550020”的来源。然后从中调查值2455768137550020是一个事务号,我检查了所有列,它们都是两个表上匹配的数据类型。我在两个表中都没有int列,@transaction被设置为varchar(50),我将继续调查,希望我能找到错误。我猜[transaction]列是int?试着这样比较。。和CAST(transaction AS VARCHAR(50))=@transaction[transaction]是一个VARCHAR,我尝试添加和CAST(transaction AS VARCHAR(50))=@transaction,但我得到语法错误-Msg 102,级别15,状态1,过程InvCompare,第9行“@transaction”附近的语法不正确。我错过了你的部分陈述吗?
declare @Transaction varchar(50)
set @Transaction='something'

select table1.a,table1.b,table1.c ,table2.d 
from table1 
left join table2 
  on table1.b=table2.d 
where table2.d is null 
  and table1.a=@Transaction
SELECT TRANSACTION, equiptype, serialnum
FROM table1
WHERE  (serialnum  COLLATE SQL_Latin1_General_CP1_CI_AS  
        NOT IN (SELECT serial_num  COLLATE SQL_Latin1_General_CP1_CI_AS FROM table2 ) 
    AND TRANSACTION = @Transaction)