2017-02-28 1 views
0

MS-SQL Serverでは、DEFAULT関数にパラメータを渡すことはできますか、何らかの理由でレコードに挿入された値にの値を設定することはできますか?DEFAULT関数を持つ列、パラメータを渡すか、挿入値を決定しますか?

MS-SQL Serverの列にDEFAULT値として関数を割り当てることができます。これを使用して、私は次のことを達成しようとしています。調査IDと患者IDを持つテーブルの場合、その調査内で新しい患者番号を自動的に割り当てる必要があります。

例えばので
CREATE TABLE [dbo].[PATIENT_STUDY](
    [PatientStudyID] [int] IDENTITY(1,1) NOT NULL, 
    [PatientID] [int] NOT NULL, 
    [StudyID] [int] NOT NULL, 
    [PatientCode] [varchar(30)] NULL, 
    [ActiveParticipant] [tinyint] NULL -- 1=yes 
) 

-- set function as DEFAULT for column PatientCode 
ALTER TABLE PATIENT_STUDY 
ADD CONSTRAINT 
    DF_PATIENT_STUDY_CODE 
    DEFAULT([dbo].[fn_Generate_PatientCode]()) 
    FOR PatientCode 

GO 

患者がSTID = 67(例えばstudycode「012」を持つ)に追加され、その研究のための最後のpatientcodeは「012から00024」だった場合、次のpatientcodeは」でなければなりません012-00025 "となる。私はこれを知っている

ID PatientID StudyID PatientCode Active 
--- --------- ------- ----------- ------- 
101 92  65  '009-00031' 1 
102 93  66  '010-00018' 1 
103 94  67  '012-00023' 1 
104 95  67  '012-00024' 1 

INSERTトリガーで達成することができるが、これはややクリーナーソリューション、保守が容易であるとして、それは、また、デフォルトでは可能だ場合、私は思っていました。

私は以下を試しました。

CREATE FUNCTION [dbo].[fn_Generate_PatientCode]() 
RETURNS VARCHAR(10) -- for example "012-00345" 
AS 
BEGIN 
    -- variables 
    DECLARE @Code_next INT 
    DECLARE @Code_new VARCHAR(10) 

    -- find values of current record, how? 
    DECLARE @STID INT 
    SET @STID = ?? -- How to determine current record? <--------------------- !! 

    -- determine the studycode, example '023-00456' -> '023' 
    SET @StudyCode = (SELECT StudyCode FROM Study WHERE StudyID = @STID) 

    -- determine max study nr per study, example '123-00456' -> 456 
    SET @Code_next = (SELECT MAX(SUBSTRING(PatientCode, 5, 5)) 
       FROM PATIENT_STUDY 
       WHERE IsNumeric(SUBSTRING(PatientCode, 5, 5)) = 1 
       AND StudyID = @STID 
       ) + 1 -- get next number 

    -- check if first patient in this study 
    IF (@Code_next is null) 
    BEGIN 
     SET @Code_next = 1 
    END 

    -- prefix with zeroes if needed 
    SET @Code_new = @Code_next 
    WHILE (LEN(@Code_new) < 5) SET @Code_new = '0' + @Code_new 

    -- build new patient code, example '012-00025' 
    SET @Code_new = @StudyCode + '-' + @Code_new 

    -- return value 
    RETURN @Code_new 
END 
+0

割り当てを逐次実行できる場合は、ID列またはシーケンスを使用することをお勧めします。計算列として012-00025を構築することができます。 –

答えて

1

いいえ、私はあなたがトリガーなしでそれを行うことはできないと思います。

+0

私はそれについて考えましたが、あなたはINSERT TRIGGERでこれをどのように達成しますか?つまり、INSERTトリガー内でMAX(PatientCode)を決定する必要がありますが、患者を一括して挿入すると、同じpatientcodeを持つことになります。 – BdR

+0

@BdR「トリガーの代わりに」の検索を行います。 –

+0

私は 'INSERTED'テーブルにカーソルを使用する' AFTER INSERT'トリガを追加することで、解決策を得ました。挿入されたすべてのレコードをループし、レコードごとに 'PatientCode'を設定します。 – BdR

関連する問題