Sql “where”条件在“in”子句中不起作用
我有三张桌子如下Sql “where”条件在“in”子句中不起作用,sql,sql-server,Sql,Sql Server,我有三张桌子如下 Orders [orderNo int] OrderDetails [orderNo int , qty int] StoreDocuments [docNo int, systemKey nvarChar(20)] 当我执行以下查询以获取没有任何StoreDocuments的订单时,我得到了这个错误 将nvarchar值“.”转换为数据类型int时,转换失败 代码: 当StoreDocuments中没有systemKey值为“”的记录时,会引发错误 我的问题是,为什么在内部
Orders [orderNo int]
OrderDetails [orderNo int , qty int]
StoreDocuments [docNo int, systemKey nvarChar(20)]
当我执行以下查询以获取没有任何StoreDocuments的订单时,我得到了这个错误
将nvarchar值“.”转换为数据类型int时,转换失败
代码:
当StoreDocuments中没有systemKey值为“”的记录时,会引发错误
我的问题是,为什么在内部查询where systemkey“”中使用where子句
未按预期执行,并导致引发错误?这应该适用于您:
Select Sum(Dt.Qty) as SumQty
From
Orders as [Or] inner join OrderDetails as Dt
on [Or].orderNo = Dt.orderNo
Where cast([Or].orderNo as nvarchar(20)) Not IN
(
Select SystemKey From StoreDocuments Where SystemKey <> '.'
)
出现异常的原因是SQL Server试图将orderNo与任何SystemKey条目匹配。它通过在比较之前将SystemKey条目转换为int来实现这一点。您的一个条目是不可转换的,即它不是一个数字,因此您将获得例外 怎么办?将orderNo转换为NVarChar,然后一切都会好起来
Select Sum(Dt.Qty) as SumQty
From Orders o
inner join OrderDetails as Dt
on o.orderNo = Dt.orderNo
Where cast(o.orderNo as NVarChar) Not IN
(
Select SystemKey From StoreDocuments Where SystemKey <> '.'
)
请注意:Order是一个关键字,or是一个关键字。SystemKey的数据类型是什么?or.orderNo是一个整数,但不是在selectsystemkey中。。。是一组nvarchar。@Tarh systemKey数据类型是nvarchar。我的问题是,如果where子句正确执行具有“.”的记录,那么where子句为什么不能按预期执行?因为systemKey值不会返回。您不能或至少不应该将整数与varchar列进行比较,varchar列也称为将苹果与苹果进行比较橘子。根据表定义和列名,orderNo中似乎不太可能有任何值与systemKey中的值匹配。如果使用NVarchar或varchar,我建议始终显式定义变量的长度。您是否立即知道强制转换的默认情况是什么。。。。。如果仅使用NVarchar作为存储过程的参数,则默认为1个字符-通常不是您想要的!我希望SQL Server在获得内部查询后运行主查询result@marc_s:是的,我知道,因为我用这种方式。它使转换非常方便,而不必费心处理长度。无论如何,谢谢你指出这一点。另外,我认为nvarcharsuit更好,因为SystemKey列是NVarCharas well.user2315555我知道如何解决问题以获得期望的结果我刚才问了为什么会发生这种情况,然后偷偷地@alzaimar回答了我的问题
Select Sum(Dt.Qty) as SumQty
From Orders o
inner join OrderDetails as Dt
on o.orderNo = Dt.orderNo
Where cast(o.orderNo as NVarChar) Not IN
(
Select SystemKey From StoreDocuments Where SystemKey <> '.'
)