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还没有开始使用哈哈