【发布时间】:2021-03-19 05:01:55
【问题描述】:
我正在尝试编写一个 SQL 查询来满足以下要求。表、列和值的所有命名约定都是正确的。然而我的查询没有返回任何内容。
- 检查
SpecializationCode是否存在于Specialization表中。如果不存在,则将SpecializationCode和SpecializationName插入Specialization表中 - 将医生详细信息插入
Doctor表中 - 将新生成的
DoctorID和给定的SpecializationCode插入到DoctorSpecialization表中,SpecializationDate作为当前日期
CREATE PROCEDURE usp_AddDoctorDetails
(@DoctorName VARCHAR(25),
@SpecializationCode CHAR(3),
@SpecializationName VARCHAR(20))
AS
BEGIN
DECLARE @DoctorID INT
SELECT @DoctorID = DoctorID
FROM Doctor
WHERE DoctorName = @DoctorName
BEGIN TRY
IF NOT EXISTS (SELECT SpecializationCode FROM Specialization
WHERE @SpecializationCode = SpecializationCode)
BEGIN
INSERT INTO Specialization (SpecializationCode, SpecializationName)
VALUES (@SpecializationCode, @SpecializationName)
INSERT INTO Doctor (DoctorID, DoctorName)
VALUES (@DoctorID, @DoctorName)
INSERT INTO DoctorSpecialization (DoctorID, SpecializationCode, SpecializationDate)
VALUES (@DoctorID, @SpecializationCode, GETDATE())
RETURN -1
END
END TRY
BEGIN CATCH
RETURN -99
END CATCH
END
GO
【问题讨论】:
-
我不明白:如果存在
Doctor行,您将获得PK 违规。如果它不存在,那么@DoctorId将为空且 PK 不能为空。你想用Doctor表做什么?如果您删除TRY/CATCH,您将确切看到发生了什么错误 -
你吃错了。不要捕获错误并且什么也不做。调用者必须知道是否发生错误。 DoctorName 是否作为 Doctor 中的唯一键/约束强制执行?如果不是,那么你的逻辑是有很大缺陷的。 SpecializationCode 是 Specialization 中的主键和 Doctor 中的外键吗?如果没有,您还有更多架构问题。
标签: sql sql-server tsql stored-procedures