将字符串列查询为数字

时间:2015-10-15 15:49:50

标签: sql-server-2008-r2

我正在开发多个SQLServer数据库版本,所以我不能使用TRY_CONVERT,因为必须支持SQLSERVER 2008 R2。

我有几个共享相同设置值的表,其中许多是数字,但其中一些不是。 (糟糕的是,糟糕的设计决定,但遗留代码很难改变。)

我需要获取一个列表,其中列出了在一定范围内的数字为整数的所有唯一值。

所以我的SQL看起来有点像这样:

SELECT C1, C2_AS_INT (
  SELECT C1, CAST( LTRIM(RTRIM(C2)) AS INT ) AS C2_AS_INT FROM T1 WHERE ISNUMERIC(C2) = 1 --We are accepting of any problems with ISNUMERIC
  UNION
  SELECT C1, CAST( LTRIM(RTRIM(C2)) AS INT ) AS C2_AS_INT FROM T2 WHERE ISNUMERIC(C2) = 1
) AS C2_AS_INT_QUERY

这很好,它可以工作(虽然我不确定外部查询中的数据类型C2_AS_INT是什么。)

但是,当我向其添加where子句时,我收到的错误是由于从nvarchar转换为int而导致失败。

SELECT C1, C2_AS_INT (
  SELECT C1, CAST( LTRIM(RTRIM(C2)) AS INT ) AS C2_AS_INT_INNER FROM T1 WHERE ISNUMERIC(C2) = 1 --We are accepting of any problems with ISNUMERIC
  UNION
  SELECT C1, CAST( LTRIM(RTRIM(C2)) AS INT ) AS C2_AS_INT_INNER FROM T2 WHERE ISNUMERIC(C2) = 1
) AS C2_AS_INT_QUERY
WHERE C2_AS_INT >= 1

似乎它正在向内部查询添加WHERE子句而不是外部查询,我怀疑它应该被强制转换为INT。

有关如何解决此错误的任何建议?

1 个答案:

答案 0 :(得分:0)

对于所有意图和目的,我能够将原始查询带入表值函数。然后我可以按预期将where子句应用于UDF的结果。

虽然我将此标记为已接受的答案,但我仍然有兴趣知道是否有一种技术可以在查询级别应用以使其发挥作用。