如何在存储过程中使用sql IN?

时间:2014-02-11 01:13:05

标签: sql stored-procedures

我创建了一个像这样的存储过程

CREATE PROCEDURE chfselfmanagemonitor.GetPatientList
(IN DoctorID INT, IN PATIDs VARCHAR(255))
BEGIN 
select pb.`PatientBasicId`, concat(concat(pb.`PatientFirstName`, ' '), concat(pb.`PatientLastName`, '')) as PatientName 
from patientchfbasicdata pb
where pb.`PatientBasicId` IN (PATIDs)
ORDER BY pb.`PatientBasicId` asc;
END @@ 
DELIMITER ; 

然而,当我这样调用时,调用GetPatientList(1002,'1001,1002,1004');我只得到1001的结果。有人能说出什么问题吗?

2 个答案:

答案 0 :(得分:0)

看起来您需要将字符串拆分为INT数组。您可以通过创建一个函数来实现它。 Read More here

答案 1 :(得分:0)

PATID是一个字符串,而不是一个整数列表。您需要首先拆分字符串然后检查输入。我还建议从你的PATID中删除空格,以便更容易拆分,因为不需要修剪(例如GetPatientList(1002,'1001,1002,1004'))

请参阅此文章,了解如何创建将分割字符串的函数,然后允许您使用IN子句

https://stackoverflow.com/a/11105413/853295

或者这个

http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm

编辑 - 使用第二个链接中的方法2会产生如下所示:

CREATE PROC dbo.GetPatientList
(
PATIDs varchar(255)
)
AS
BEGIN
SET NOCOUNT ON

CREATE TABLE #TempList
(
    PatientBasicId int
)

DECLARE PATIDs varchar(10), @Pos int

SET PATIDs = LTRIM(RTRIM(PATIDs))+ ','
SET @Pos = CHARINDEX(',', PATIDs, 1)

IF REPLACE(PATIDs, ',', '') <> ''
BEGIN
    WHILE @Pos > 0
    BEGIN
        SET PATIDs = LTRIM(RTRIM(LEFT(PATIDs, @Pos - 1)))
        IF PATIDs <> ''
        BEGIN
            INSERT INTO #TempList (PatientBasicId) VALUES (CAST(PATIDs AS int)) --Use Appropriate conversion
        END
        SET PATIDs = RIGHT(PATIDs, LEN(PATIDs) - @Pos)
        SET @Pos = CHARINDEX(',', PATIDs, 1)

    END
END 

SELECT pb.`PatientBasicId`, concat(concat(pb.`PatientFirstName`, ' '), concat(pb.`PatientLastName`, '')) as PatientName
FROM    patientchfbasicdata pb
    JOIN 
    #TempList t
    ON pb.`PatientBasicId` = t.PatientBasicId

END
GO

您可以在SQL中调用存储过程,如

exec GetPatientList '1001,1002,1004'