Sql server Sql检查字符串数组中的多个值

Sql server Sql检查字符串数组中的多个值,sql-server,stored-procedures,Sql Server,Stored Procedures,我要做的是我有一个字符串数组,它有一个或多个值。当我将这些值传递给sql时,我试图检查每个值上的一个字段是否包含pass或fail。我可以一对一地做到这一点。但现在的要求是需要同时检查多个值或ID。我甚至不确定从哪里开始。大多数文章建议将信息存储在表中。原因是前1名,因为某些数据已处于失败状态。所以我在寻找最近的失败案例 以下是检查一个ID的sql: declare @PTSID = '7VD6GSZG' Select top (1) p_id, insp_status from Ins

我要做的是我有一个字符串数组,它有一个或多个值。当我将这些值传递给sql时,我试图检查每个值上的一个字段是否包含pass或fail。我可以一对一地做到这一点。但现在的要求是需要同时检查多个值或ID。我甚至不确定从哪里开始。大多数文章建议将信息存储在表中。原因是前1名,因为某些数据已处于失败状态。所以我在寻找最近的失败案例

以下是检查一个ID的sql:

declare @PTSID = '7VD6GSZG'
Select top (1)
p_id,   
insp_status 
from Insp_Results   
where RESV_PTSID = @PTSID
order by RESD_DATE desc
但是如果我有这样的东西

declare @PTSID nvarchar(1000) = '7VD6GSZG, 8V9WKX78, DOJUSEM8'
如何检查每个ID的列检查状态? 所以理想情况下我想要

p_id      |   insp_status
7VD6GSZG      fail
8V9WKX78      fail
DOJUSEM8      pass

您可以在条件中使用SQL。的语法为:

    expression IN (value1, value2, .... value_n);
因此,在您的情况下,它可能类似于:

    declare @PTSID = nvarchar(1000);
    SET @PTSID = '7VD6GSZG, 8V9WKX78, DOJUSEM8';
    Select top (1)
    p_id,   
    insp_status 
    from Insp_Results   
    where RESV_PTSID IN @PTSID
    order by RESD_DATE desc

创建一个函数,将字符串更改为表,如下所示:

CREATE FUNCTION [dbo].[function_string_to_table]
(
    @string VARCHAR(MAX),
    @delimiter CHAR(1)
)
RETURNS @output TABLE(
    data VARCHAR(256)
)
BEGIN

    DECLARE @start INT, @end INT
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)

    WHILE @start < LEN(@string) + 1 BEGIN
        IF @end = 0 
            SET @end = LEN(@string) + 1

        INSERT INTO @output (data) 
        VALUES(SUBSTRING(@string, @start, @end - @start))
        SET @start = @end + 1
        SET @end = CHARINDEX(@delimiter, @string, @start)
    END

    RETURN

END
declare @PTSID nvarchar(1000) = '7VD6GSZG, 8V9WKX78, DOJUSEM8'

select *, CASE WHEN CHECKT.data is null THEN 'false' ELSE 'true' END as dataExists 
from Insp_Results  R 
LEFT JOIN [dbo].[function_string_to_table](@PTSID, ',') CHECKT ON CHECKT.data = R.RESV_PTSID

您需要解析以逗号分隔的字符串,以便在每个值周围加上单引号:“7VD6GSZG”、“8V9WKX78”、“DOJUSEM8”。您还需要将WHERE条件从=更改为@PTSID中的:WHERE RESV_PTSID。你的问题中不清楚的是你为什么选择前1名。您需要解释一下,这样我们才能知道如何回答您的问题。^where column in@variable是一个无意义的构造,它降级为where column=@variable。您不能用这种方式与多个值进行比较。您需要使用子查询。子查询可以引用表变量,但仍然需要查询。@variable中的where列是一个无意义的构造,它降级为where column=@variable。您不能用这种方式与多个值进行比较。您的答案是查找Revptsid等于整个逗号分隔值的1行。这确实有效,但我找不到这两个值。我已经将连接更改为内部连接,但我仍然只能获得一个ID,不能同时获得两个ID。也许您需要将其反转:选择*,当CHECKT.data为null时,则“false”否则“true”结束,因为[dbo]中存在数据。[function_string_to_table]@PTSID],“CHECKT LEFT join Insp\u Results R ON CHECKT.data=R.RESV\u PTSID这是您需要的吗?我不太明白。使用带循环的拆分器是拆分字符串最慢的方法。请参阅本文,了解一些性能更好的替代方案。