1

作为 SQL 查询的一部分,我有以下代码:

INSERT INTO [Database]  
 SELECT DISTINCT @ssId 
   FROM [Document_Map] 
  WHERE (LabelId IN (SELECT Tokens 
                       FROM StringSplitter(@sortValue, '|', 1))

只要@SortValue是整数、(LabelId也是 int)或由分隔符分隔的整数(例如,SortValue 420|421| 与 420 和 421 比较),代码就可以正常工作。但是,我正在添加涉及非整数值的功能@sortValue。例如:420|ABC|421| 应该与 420、ABC 和 421 进行比较。

不用担心,我想。我将修改该查询的最后一行!

(LabelId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) OR 
StringId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)))

不幸的是,每当我输入@sortValue其中的字符时,都会出现错误。它从未到达过远方or

经过一番折腾,我终于确定 SQL 正在将 StringSplitter 函数的字符串结果转换为与 LabelId 进行比较。当字符串结果被保证只包含数字字符时没有问题,但是 SQL 拒绝将非数字字符串强制转换(可以理解)为 int,从而抛出错误。

在保持所需功能的同时解决此错误的最简单方法是什么?由于数据库交互,我不确定更改类型是否LabelId是一个可行的选择。

4

3 回答 3

4

扩展 DCP 所说的内容,试试这个代码:

(Convert(varchar(32),LabelId) IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) OR 
StringId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)))

请注意性能问题,在 WHERE 子句中进行强制转换可能会导致问题......

于 2010-07-22T19:03:04.577 回答
4

我有建议但也有问题...

根本原因是数据类型优先规则。

我不明白为什么要将数字列与字符串数据进行比较?为什么要发送非数字数据进行比较?

如果将转换为字符串的 int LabelID "24" 与 "024" 字符串进行比较,则会失败。当转换为 int 时,字符串“024”变为“24”并且会匹配。你想要和期待什么样的行为?

我可以理解使用 ISNUMERIC 修复损坏的架构或整理数据,但您似乎是故意发送字符串。

无论如何,你的修复是

  • 更改列类型以匹配您发送的内容
  • CAST 列
  • 在字符串拆分(例如“StringSplitterToInt”)或客户端中从比较中过滤字符串

我建议 1 号来反映您的模型和实际数据或 3 号来修复您的代码......

于 2010-07-22T19:18:57.433 回答
2

对于您的功能问题,请尝试 ISNUMERIC:

; WITH data (Foo) AS (
             SELECT '1'
   UNION ALL SELECT 'abc'
)
SELECT
   *
FROM data
WHERE ISNUMERIC(Foo) = 1;

此外,如果您的 Split 函数使用任何其他表(如公共数字表),请将拆分部分移出 SELECT 语句并将结果存储在临时表中。在语句的 WHERE 部分调用具有模式绑定的表值函数可以(并且经常这样做)导致为表的每一行调用函数。

于 2010-07-22T19:06:08.583 回答