繁体   English   中英

SQL 存储过程中的 IN 子句

[英]SQL IN Clause In Stored Procedure

我有一个传递以下数据的 C# 应用程序:

数据集ID = 10; 用户ID = 1; varnames = "'ACT97','ACTCHNG','ACTQTR2','ACTSCOR2'";

存储过程是:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[s_LockCheck]
-- Add the parameters for the stored procedure here
@varNames VARCHAR(max),
@datasetID INT,
@userID INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON

SELECT COUNT(*) as locked FROM VarLocks WHERE var_name IN (@varNames) AND dataset_id = @datasetID AND user_id != @userID AND is_locked = 1

END

但是当我这样称呼它时,当它应该高于该值时,它返回的计数为 0:

exec s_LockCheck "'ACT97','ACTCHNG','ACTQTR2','ACTSCOR2'", 88, 14

上面的每个 ACTXXX 都是来自列 var_name 的变量名。

为什么它没有正确执行 IN 子句?

有几种方法可以实现此目的:

  1. 本文指出的动态SQL: http : //asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. 在变量中指定每个项目(如果您有很多'em,这可能会很难看):

    @ var1 varchar(20),@ var2 varchar(20),@ var3 varchar(20)

  3. 编写一个split函数将字符串转换为表变量,其中有很多。 这是我个人的最爱: http : //dataeducation.com/faster-more-scalable-sqlclr-string-splitting/

  4. 使用表值参数(2008): http : //www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. 这是使用CHARINDEX的一个小技巧(请注意,这种方法是不可持久的):

您的字符串如下:'abc,def'

使用CHARINDEX ,您可以用定界符填充搜索字符串和要在搜索字符串中找到的值。 因此,使用我的小示例,字符串将变为“,abc,def”,请注意开头和结尾的多余逗号。 然后对字段数据执行相同的操作。 如果数据中包含逗号,则必须将分隔符换成其他内容,例如char(2)或分号或其他内容。

然后执行搜索:

WHERE CHARINDEX ( ',' + expressionToFind + ',' , ',' + expressionToSearch ',') > 0

分界符填充使搜索无法找到“ abcabc”,但将找到“ abc”(完全匹配)。

如果您使用的是2005,则可以使用真正快速的拆分功能,从而避免使用动态SQL。

您的查询应使用STRING_SPLIT作为IN ,如下所示:

SELECT COUNT(*) as locked FROM VarLocks 
WHERE var_name 
IN (SELECT value FROM STRING_SPLIT(@varNames, ',')) 
AND dataset_id = @datasetID 
AND user_id != @userID 
AND is_locked = 1

IN 运算符的语法错误: IN (@varNames)并且您需要IN (SELECT value FROM STRING_SPLIT(@varNames, ',')) STRING_SPLIT 根据定界符执行字符串拆分,在您的情况下为逗号。

从 c# 传递逗号分隔的字符串

sql WHERE Location IN (SELECT value FROM STRING_SPLIT(@SearchLocation,'|'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM