首页 > 解决方案 > 如何阻止 SQL 尝试将 nvarchar 转换为 INT?

问题描述

我正在尝试在 SQL 中运行一个简单的查询,但我不断收到错误”

将 nvarchar 值“EA000006”转换为数据类型 int 时转换失败。

我不希望 SQL 将数据转换为 INT,我希望它像通常存储的那样简单地显示列中的所有结果。是什么导致我的脚本尝试转换此字段?脚本很简单:

SELECT
    A.OrderNbr as 'Order Number' (The Field Causing the error)
   ,A.OrderDate as 'Order Date'
   ,B.InventoryCD as 'SKU'
   ,A.TranDesc as 'Descrption'
   ,A.OrderQty as 'Quantity'
   ,A.ExtPrice as 'Price'
   ,C.Distributor_ID as 'Distributor ID'
   ,C.First_Name as 'First Name'
   ,C.Last_Name as 'Last Name'
   ,C.Ship_Address as 'Ship Address'
   ,C.Ship_Address_2 as 'Ship Address 2'
   ,C.Ship_City as 'Ship City'
   ,C.Ship_Region as 'Ship State'
   ,C.Ship_Country as 'Ship Country'
   ,C.Ship_Postal_Code as 'Ship Postal Code'
   

  FROM [SOLine] A
    LEFT JOIN [InventoryItem] B
      ON A.InventoryID = B.InventoryID AND A.CompanyID = B.CompanyID
    LEFT JOIN [Orders] C
      ON A.OrderNbr = C.Order_ID

  WHERE  A.OrderDate >= '2020-01-01'
    AND A.OrderDate < '2021-01-01'

标签: sqlsql-servertsql

解决方案


评估此连接子句时:

ON A.OrderNbr = C.Order_ID

不同类型(nvarcharint)的值必须根据数据类型优先规则转换为相同类型进行比较。避免该错误的一种方法是将int列显式转换为nvarchar. 例如(假设Order_ID是 int):

ON A.OrderNbr = CAST(C.Order_ID AS nchar(10))

在这样做之前,请注意一些含义:

  • 转换将阻止索引Order_ID被有效使用
  • 比较将遵循字符而不是数字比较规则(例如,OrderNbr 值“00”将不等于Order_ID值 0)
  • 该错误可能是因为您正在比较错误的列,因为如果它们实际上是相同的属性,则类型应该相同

推荐阅读