0

我有一个 MS SQL Server 脚本,我在其中创建了一个临时存储过程,当传递两个患者标识符时,它会选择并打印第二个患者的详细信息。然后,它使用这些标识符和详细信息来调用另一个存储过程以将这两个患者合并在一起。

该脚本在这里的几个测试数据库上完美运行,但是当我在繁忙的站点上运行相同的脚本时,看起来好像我选择那些患者详细信息的局部变量“偶尔”没有及时填充以进行打印,但是合并过程的后续执行总是让它们填充得很好。大多数情况下,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:如果我确实创建了 ... (@var int = Null),它会告诉 proc 它接受 NULLS 并且可以输入 null 值作为输入。如果您执行默认的 create .... (@var int),则它需要输入值。您正在覆盖默认值,然后重新声明默认值。我不明白你为什么要这样做。

如果您将默认行为设置为需要非空值,则除非为其列出变量,否则 proc 将失败,这就是您希望它出现的内容。

至于 proc 有时工作,有时不工作,我认为如果输入变量为空,您可能应该在输入变量上设置默认值。

-- 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 回答