【问题标题】:Stored procedure does not update the table存储过程不更新表
【发布时间】:2021-07-18 14:19:58
【问题描述】:

我想要一个存储过程来根据生日计算年龄。

这是我的存储过程:

CREATE PROCEDURE CalculateAge
AS
    UPDATE Person
    SET Age = DATEDIFF(year, GETDATE(), BirthDate) 
    WHERE Age = Null;

这是我的表“人”

CREATE TABLE [dbo].[Person]
(
    [Id] [int] NOT NULL,
    [BirthDate] [date] NOT NULL,
    [Email] [nvarchar](150) NOT NULL,
    [Lastname] [varchar](50) NOT NULL,
    [Firstname] [varchar](50) NOT NULL,
    [Age] [nchar](10) NULL,

    CONSTRAINT [PK_Person] 
        PRIMARY KEY CLUSTERED 
)

但是,当我执行该过程时,带有“Person”的表并没有改变。它不会用年龄填充列...

可能是什么问题?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。你真的在调用存储过程吗?
  • OT 为什么将 Age 声明为 nchar 而不是 int?
  • 事实上,即使int - tinyint 也不是正确的数据类型,除非你碰巧是真人快打中的 Sub-zero :)
  • Age 应该是计算列,否则您将需要不断更新它

标签: sql-server stored-procedures ssms


【解决方案1】:

一个明显的问题是:

UPDATE Person
    SET Age = DATEDIFF(year, GETDATE(), BirthDate)
    WHERE Age = Null;
    ----------^

等式的计算结果总是NULL(即使ageNULL)。而WHERE 子句过滤掉NULL 结果。可以使用以下方法修复该部分:

UPDATE Person
    SET Age = DATEDIFF(year, GETDATE(), BirthDate)
    WHERE Age IS Null;

接下来您会发现所有年龄都是负数,但那是您包含的代码。假设 BirthDates 是过去的,您希望参数的顺序相反。

您的CREATE TABLE 也不起作用,因为PRIMARY KEY 约束不正确。但是,该表似乎存在,因此我认为这是编写问题时的转录错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多