2017-02-28 5 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 

환자가 (studycode "012"로, 예를 들어) STID = 67에 추가하고, 그 연구의 마지막 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)'를 결정해야하지만, 환자를 일괄 적으로 삽입하면 모든 환자 코드는 동일하게됩니다. – BdR

+0

@BdR '대신 트리거'를 조회합니다. –

+0

나는'INSERTED' 테이블에 커서를 사용하는'AFTER INSERT' 트리거를 추가함으로써 실제적인 해결책을 얻었습니다. 삽입 된 모든 레코드를 반복하고 각 레코드에 대해 'PatientCode'를 설정합니다. – BdR