转换数据类型varchar时出错

adi*_*nas 6 sql t-sql sql-server

我目前有一个列为列的表varchar.此列可以包含数字或文本.在某些查询期间,我将其视为一个bigint列(我在它与另一个表中的列之间进行连接bigint)

只要这个字段中只有数字没有问题,但是在这个字段中只有一行甚至一行有文本而不是数字我得到了"将数据类型转换varchar为错误bigint".错误,即使在WHERE部分,我确保没有文本字段出现.

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

SELECT     TOP (100) PERCENT ID, CAST(MyCol AS bigint) AS MyCol
FROM         MyTable
WHERE     (isnumeric(MyCol) = 1)
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM MyView where mycol=1
Run Code Online (Sandbox Code Playgroud)

在对视图进行查询时,它不应该知道它背后发生了什么!它应该只是看到两个bigint领域!(参见附图,甚至mssql管理工作室显示视图字段为bigint)

adi*_*nas 4

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

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]%')
Run Code Online (Sandbox Code Playgroud)

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

现在,当我与其他 bigint col 进行连接或执行“SELECT * FROM MyView where mycol=1”之类的操作时,它会返回正确的结果,没有错误。我的猜测是,查询本身中的 CAST 导致查询优化器不查看原始表,正如 Christian Hayter 所说,其他视图可能会发生这种情况