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

如何在存储过程中使用sql?,sql,stored-procedures,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 patientc

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

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 ; 

然而,当我像这样调用GetPatientList1002,'100110004';我只得到了1001的结果。有人能告诉你出了什么问题吗?

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

PATIDs是一个字符串,而不是int的列表。您需要先拆分字符串,然后签入fo。我还建议从您的空间中删除空间,以使拆分更容易,因为不需要修剪例如GetPatientList1002、'100110021004'

请参阅本文,了解如何创建一个函数,该函数将拆分字符串,然后允许您使用IN子句

还是这个

编辑-使用第二个链接中的方法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

它给出了一个错误,说明StoredProc只接受2个参数,而不是4个参数。你在用DoctorID参数做什么吗?哦,我明白了。您需要找到将该字符串转换为INT数组的方法。在不使用DoctorID时,为什么它是一个参数?这是特定于SQL Server的,但当我看到这个问题时,我总是指向它。以前有人问过很多次。Thx,我尝试过,下面是如何创建SP:DELIMITER\\DROP过程(如果存在)GetPatientList\\create过程GetPatientList在OrderList VARCHAR500 BEGIN SET@s='中选择PatientBasicd,PatientFirstName,patientchfbasicdata中的PatientLastName,其中PatientBasicId位于“+OrderList+”中;从@s制备stmt1;执行stmt1;解除分配准备stmt1;结束\\分隔符;但当我像这样执行它时,会出现错误:调用GetPatientList'100110021003';错误代码1064,SQL状态42000:您的SQL语法有错误;使用“1001”附近的语法参见第二个链接中使用方法2的修订答案
exec GetPatientList '1001,1002,1004'