【问题标题】:Why does query return no results为什么查询没有返回结果
【发布时间】:2021-03-19 05:01:55
【问题描述】:

我正在尝试编写一个 SQL 查询来满足以下要求。表、列和值的所有命名约定都是正确的。然而我的查询没有返回任何内容。

  • 检查SpecializationCode 是否存在于Specialization 表中。如果不存在,则将SpecializationCodeSpecializationName 插入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


【解决方案1】:

TRY 块中将 Return -1 替换为 SELECT 1 / 0 AS Error;Return -99 替换为 ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage;CATCH 块中

仅使用 TRY CATCH 块进行更改后,您的程序如下所示

 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()) 

            SELECT
             1 / 0 AS Error; 
        END 
  END try 

  BEGIN catch 
    SELECT 
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
  END catch

【讨论】:

  • 否 - 不吃错误并将错误信息作为常规结果集返回。
猜你喜欢
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2011-11-07
  • 2022-08-18
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多