首页 > 解决方案 > IF子查询需要测试几个值

问题描述

如何拆分字符串以便访问项目 x?- 解决方案已使用CTEWHILE。我告诉我的请求没有使用 WHILE,因为这不是很好的性能,它会延迟速度.. 同样适用CURSOR

我正在使用 SQL Server 2012。我将获得一串 id ( @IDs),需要针对某个值(在本例中为 1)进行测试。

IF (SELECT CycleId
    FROM TABLE1
    WHERE ID in (@IDs) ) = '1'
BEGIN
     -- ABORT TRANSACTION AND FINISH THE QUERY
END
ELSE
BEGIN
     -- START TRANSACTION FOR THE Id....
END

这不起作用。有人告诉我应该避免使用WHILEor 。CURSOR

我需要运行 @Ids 中存在的几个值(它可以是 100 个值,也可以是 5 个用逗号分隔的值)。如果这些 Id 中至少有一个具有 CycleId=1,它应该完全停止操作。也许它可能是...

BEGIN          
      RAISERROR ('It is not possible to complete the transaction.',20,1)
      BREAK
END

第一种情况:

@IDs = 121, 434, 543, 345

Id    CycleId
---------------
121      1
434      2
543      1
345      1

在这种情况下,操作应该在@Id 121 处停止(它不应该读取/测试任何其他 ID,它应该像我之前展示的那样抛出错误)

第二种情况

@IDs = 121, 434, 543, 345

Id    CycleId
--------------
121      3
434      2
543      5
345      6

在这种情况下,操作应该执行事务。

谢谢!

标签: sqlsql-serversql-server-2012

解决方案


假设您的字符串变量@ids看起来像这样:' 2, 4 , 5 , 7,8,9,10, 21,22',您可以尝试以下操作:

-- pre-condition @ids by removing blanks and adding a comma at either end:
select @ids=','+replace(@ids,' ','')+',';

IF (SELECT 1 FROM TABLE1 WHERE patindex(concat('%,',CycleId,',%',@ids)>0 )
BEGIN
 -- ABORT TRANSACTION AND FINISH THE QUERY
END
ELSE
BEGIN
 -- START TRANSACTION FOR THE Id....
END

推荐阅读