小编典典

转换数据类型varchar时出错

sql

我目前有一个表,其列为varchar。该列可以容纳数字或文本。在某些查询期间,我将其视为一bigint列(我将其与另一个表中的列进行连接bigint

只要在该字段中只有数字没有问题,但是即使是一分钟的分钟也有文本,而在此字段中没有数字,我就会收到“将数据类型转换varchar为的错误bigint”。即使在WHERE部分中,我也确保所有文本字段都没有出现。

为了解决这个问题,我创建了一个视图,如下所示:

SELECT     TOP (100) PERCENT ID, CAST(MyCol AS bigint) AS MyCol
FROM         MyTable
WHERE     (isnumeric(MyCol) = 1)

但是,即使视图仅显示具有数字值的行并将Mycol强制 转换为bigint,但 在运行以下查询时, 将数据类型varchar转换 为bigint仍然会
出错

SELECT * FROM MyView where mycol=1

当对视图进行查询时,它不应该知道它背后发生了什么!它应该只看到两个bigint字段!(请参见附件图像,甚至mssql
Management Studio都将视图字段显示为bigint)


阅读 212

收藏
2021-03-10

共1个答案

小编典典

好的。我终于创建了一个有效的视图:

SELECT TOP (100) PERCENT id, CAST(CASE WHEN IsNumeric(MyCol) = 1 THEN MyCol ELSE NULL END AS bigint) AS MyCol
FROM         dbo.MyTable
WHERE     (MyCol NOT LIKE '%[^0-9]%')

感谢 AdaTheDevCodeByMoonlight 。我用你的两个答案来解决这个问题。(当然也感谢其他回复者)

现在,当我加入其他bigint col或执行类似“ SELECT * FROM MyView where mycol =
1”的操作时,它将返回正确的结果,没有错误。我的猜测是,查询本身中的CAST导致查询优化器无法查看原始表,就像克里斯蒂安·海特(Christian
Hayter)所说的那样,可能会与其他视图一起使用

2021-03-10