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