使用两列自动生成患者ID

时间:2017-06-26 09:21:54

标签: sql vb.net sql-server-2008-r2 vb.net-2010

在筛选表格中我有StudyID。 StudyID是两个数字StudyType(For Cases = KNH-01,For Controls = KNH-02)和Serealized 5位数(00001,00002)的组合。所以筛选表看起来像这样;

ID StudyID Age 1 KNH-01/00001 22 2 KNH-01/00002 15 3 KNH-02/00001 4 4 KNH-02/00002 28

目前,StudyID号码被手动保存在日志中,我希望自动化生成StudyID号码的过程。我创建了一个表来管理StudyID

CREATE TABLE [dbo].[PatientID](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [PatientType] [varchar](5) NULL,
    [PatientNumber] [int] NULL,
 CONSTRAINT [PK__PatientI__3214EC2739E294A9] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

根据PatientNumber我无法获得最后PatientType我的意图是当用户点击生成StudyID时在vb.net前端有一个按钮,它会检查最后给定的数字一个studytype为它添加1并加载形成。例如KNH-01/00003KNH-02/00003。如果你有更好的想法,我将非常感激。

1 个答案:

答案 0 :(得分:0)

嗯,我个人最喜欢的解决此类需求的方法是使用计算列和UDF来计算该列中的值。

首先,您创建UDF:

CREATE FUNCTION dbo.GenerateStudyID (
    @PatientType varchar(5),
    @id int
)
RETURNS char(11)
AS
BEGIN
    RETURN (
        SELECT @PatientType +'/'+ RIGHT('00000', CAST(COUNT(*) as char(5)), 5)
        FROM [dbo].[PatientID] 
        WHERE PatientType = @PatientType 
        AND Id <= @id
    )
END
GO

然后,将计算列添加到表中:

ALTER TABLE [dbo].[PatientID]  
ADD StudyID as dbo.GenerateStudyID (PatientType, id)
GO 

请注意如果您需要保留此列,则无法使用此方法,因为一旦删除记录,值就会更改。