我创建了一个像这样的存储过程
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的结果。有人能说出什么问题吗?
答案 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'