Sql server 在联接中将数据类型varchar转换为数值时出错

Sql server 在联接中将数据类型varchar转换为数值时出错,sql-server,tsql,Sql Server,Tsql,我有下一个问题 SELECT * FROM Assoc AS cc JOIN Orders AS o ON cc.Referencecode = o.Orderid 我得到了这个错误: 将数据类型varchar转换为数字时出错 我通过添加此条款来解决 WHERE ISNUMERIC (cc.Referencecode) = 1 我的问题是…这个解决方案行吗?(我没有更改数据类型的权限…)或者我应该在连接本身中进行转换吗 ps:ReferenceCode是varch

我有下一个问题

SELECT *
FROM   Assoc AS cc 
       JOIN Orders AS o    ON cc.Referencecode = o.Orderid
我得到了这个错误: 将数据类型varchar转换为数字时出错

我通过添加此条款来解决

WHERE  ISNUMERIC (cc.Referencecode) = 1
我的问题是…这个解决方案行吗?(我没有更改数据类型的权限…)或者我应该在连接本身中进行转换吗


ps:ReferenceCode是varchar(50)OrderId是decimal(18,0)

我更愿意做以下事情:-

SELECT *
FROM   Assoc AS cc 
       JOIN Orders AS o    ON cc.Referencecode = CAST(o.Orderid as Nvarchar(MAX))
CAST(Varchar为INT)您应该在比较之前转换它。如果是varchar

示例查询:

SELECT *
FROM   Assoc AS cc Nvarchar(MAX)
       JOIN Orders AS o    ON cc.Referencecode = CAST(o.Orderid AS Nvarchar(MAX))
以这种方式进行强制转换,可能会给您带来错误。

ISNUMERIC()
可能会给您带来误报。例如,运行这些查询

SELECT 'TRUE' WHERE ISNUMERIC('$') = 1
SELECT 'TRUE' WHERE ISNUMERIC('1e4') = 1
相反,使用下面的where子句会更安全,它会删除包含除数字以外的任何内容的列

WHERE cc.Referencecode not like '%[^0-9]%'
如果要包含小数,可以使用:

WHERE cc.Referencecode not like '%[^0-9.]%'
或适用于SQL Server 2012/2016

JOIN Orders AS o ON TRY_CONVERT(NUMERIC,cc.Referencecode) = o.Orderid
最后,您可以将它们都转换为varchar,以不删除任何行

JOIN Orders AS o ON cc.Referencecode = CAST(o.Orderid as VARCHAR(4000))

我知道这可能需要更多的工作,但是如果您有大量数据,那么您的查询将无法很好地扩展

但是如果可能的话,我会添加一个计算列,比如

ALTER TABLE dbo.Assoc
  ADD Referencecode_DEC AS ISNULL(TRY_CONVERT(decimal(18,0), Referencecode, 0) PERSISTED 
在新列上添加索引,并在运行查询时:

SELECT *
FROM   Assoc AS cc 
   JOIN Orders AS o    ON cc.Referencecode_DEC = o.Orderid

它将使用正确的统计数据,并应生成更好的计划

这取决于业务需求,通常最好(从性能角度)在连接本身中执行此操作。同样值得一提的是,通过这种方式,您可以从结果集中排除没有数字引用代码的记录。不确定这是否是你的意图?是出了名的。@Chicago,你的答案对你有用吗?这是错误的。根据OPi,Orderid没有导致错误。我认为此解决方案会在CAST上出现错误(o.Orderid为数字)。您可以将o.Orderid转换为Varchar,因为根据输出,LHS和RHS具有不同的数据类型。我猜o.Orderid是数字,cc.Referencecode是varchar。因此,您可以将numeric转换为Varchar,以便比较。或者给我发送模式,我将尝试向您推荐更好的选项。我正在挖掘“tri_convert()”,我想您偶然发现了一个非常需要的功能。。。拼音SQL+1用于try_转换,但是,您错过了ISNUMERIC('1d4'),Java还没有开始使用哈哈