Sql server TSQL局部变量似乎不会在选择后立即填充
我有一个MS SQL Server脚本,在其中我创建了一个临时存储过程,当传递两个患者标识符时,该过程将选择并打印第二个患者的详细信息。然后,它使用这些标识符和详细信息调用另一个存储过程来合并这两个患者 这个脚本在这里的几个测试数据库上运行得很好,但当我在一个繁忙的站点上运行同一个脚本时,似乎我选择这些患者详细信息的局部变量“偶尔”没有及时填充以便打印,但是合并过程的后续执行程序总是填充得很好。大多数时候,打印正确地显示了这些值 这是我正在做的一个精简版本。你觉得怎么样Sql server TSQL局部变量似乎不会在选择后立即填充,sql-server,tsql,Sql Server,Tsql,我有一个MS SQL Server脚本,在其中我创建了一个临时存储过程,当传递两个患者标识符时,该过程将选择并打印第二个患者的详细信息。然后,它使用这些标识符和详细信息调用另一个存储过程来合并这两个患者 这个脚本在这里的几个测试数据库上运行得很好,但当我在一个繁忙的站点上运行同一个脚本时,似乎我选择这些患者详细信息的局部变量“偶尔”没有及时填充以便打印,但是合并过程的后续执行程序总是填充得很好。大多数时候,打印正确地显示了这些值 这是我正在做的一个精简版本。你觉得怎么样 CREATE PROCE
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
为什么要设置“@variable(type)=null”,然后强制一个值?为什么不删除“=null”部分,它将要求用户输入一个值?如果我真的创造了。。。(@var int=Null)它告诉proc它接受Null并可以输入Null值。如果您执行默认的create。。。。(@var int)它需要输入一个值。您正在覆盖默认值,然后重新声明默认值。我不明白你为什么要这样做 如果将默认行为设置为要求非空,则除非为其列出了变量(这是您希望它出现的),否则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'
你的分析肯定不正确。任务没有时间延迟。如果它们是
NULL
则不会打印任何内容,因为串联NULL
会产生NULL
我同意。这些变量中一定有什么东西。只是想描述一下我所看到的。PRINT语句有时对局部变量不显示任何内容,但打印之后的存储过程调用总是在这些变量中包含值。您能更具体地说明您看到的内容吗?我想你说的是@xxxNm变量。您的打印输出是什么样子的,您认为传递给PatientMerge的是什么?