0

2 つの患者 ID を渡すと、2 番目の患者の詳細を選択して出力する一時ストアド プロシージャを作成する MS SQL Server スクリプトがあります。次に、それらの識別子と詳細を使用して別のストアド プロシージャを呼び出し、2 人の患者を結合します。

このスクリプトは、ここのいくつかのテスト データベースで完全に実行されますが、忙しいサイトで同じスクリプトを実行したとき、患者の詳細を選択していたローカル変数が「時折」PRINT に間に合わなかったように見えましたが、マージ手順の後続の EXEC では、常に問題なく設定されていました。ほとんどの場合、PRINT はこれらの値を正しく示しました。

ここに私がやっていることの縮小版があります。どう思いますか?

CREATE PROCEDURE [dbo].[TMP_MergeMRNs] @Merge_From_Medical_Record_Number VARCHAR(64) = NULL,
                                       @Merge_From_Institution_Name      VARCHAR(64) = NULL,
                                       @Merge_To_Medical_Record_Number   VARCHAR(64) = NULL,
                                       @Merge_To_Institution_Name        VARCHAR(64) = NULL
AS
  BEGIN
      SET NOCOUNT ON
      SET DEADLOCK_PRIORITY LOW

      /* ALL parameters must be supplied */
      IF @Merge_From_Medical_Record_Number IS NULL
          OR @Merge_From_Institution_Name IS NULL
          OR @Merge_To_Medical_Record_Number IS NULL
          OR @Merge_To_Institution_Name IS NULL
        BEGIN
            PRINT 'ERROR. One or more of the 4 required fields was empty.'

            RETURN 4
        END

      /* Retrieve the merge_to patient demographics */
      DECLARE @lstNm  NVARCHAR(64),
              @frstNm NVARCHAR(64),
              @mdlNm  NVARCHAR(64)

      SELECT @lstNm = id1.LastName,
             @frstNm = id1.FirstName,
             @mdlNm = id1.MiddleName
      FROM   [dbo].[PATIENT] pid1
             INNER JOIN [dbo].[INSTITUTION] i1
               ON pid1.InstitutionDBKey = i1.InstitutionDBKey
      WHERE  i1.InstitutionName = @Merge_To_Institution_Name
             AND pid1.MedicalRecordNumber = @Merge_To_Medical_Record_Number

      PRINT LTrim('Merge From Patient: ' + RTrim(@Merge_From_Medical_Record_Number)) + ' / ' + LTRIM(RTRIM(@Merge_From_Institution_Name))

      PRINT LTrim('Merge To Patient: ' + RTrim(@Merge_To_Medical_Record_Number)) + ' / ' + LTRIM(RTRIM(@Merge_To_Institution_Name))

      PRINT '  Name: ' + ISNULL(LTRIM(RTRIM(@lstNm)), '') + IsNull(', ' + LTRIM(RTRIM(@frstNm)), '') + IsNull(' ' + LTRIM(RTRIM(@mdlNm)), '')

      EXEC PatientMerge
        @Merge_From_Medical_Record_Number,
        @Merge_From_Institution_Name,
        @Merge_To_Medical_Record_Number,
        @Merge_To_Institution_Name,
        /* last */ @lstNm,
        /* first */ @frstNm,
        /* middle */ @mdlNm

      RETURN 0
  END

GO 
4

1 に答える 1

0

この '@variable (type) = null' を設定して、値を強制したいのはなぜですか? 「= null」部分を削除しないと、ユーザーが値を入力する必要があるのはなぜですか? EG: If I do create ... (@var int = Null) proc に ACCEPTS NULLS を伝え、null 値を入力として入れることができます。create .... (@var int) のデフォルトを実行すると、入力時に値が必要になります。デフォルトをオーバーライドしてから、デフォルトを再宣言しています。なぜあなたがこれをしているのかわかりません。

null 以外を要求するようにデフォルトの動作を設定すると、変数がリストされていない限り、proc は失敗します。

proc については、機能する場合と機能しない場合があるため、入力変数が null の場合はデフォルトを設定する必要があると思います。

-- Method 1 set a default if variable is null
declare @int int;

select @int = isnull(@int, 2);  -- variable not listed, no problem ensure there is a default or else do not more forward

select @Int
GO

-- Method 2, do not move forward if variable is null
declare @int int;

If @int is not null
BEGIN
  select @Int;
END
ELSE 
    Select 'Variable is null, please identify value if you wish system to proceed'
于 2013-01-25T18:34:22.180 に答える