SQL 存储过程查询以清除日期字段(如果为 NULL)

Posted

技术标签:

【中文标题】SQL 存储过程查询以清除日期字段(如果为 NULL)【英文标题】:SQL stored procedure query to clear date field if NULL 【发布时间】:2018-05-16 14:44:49 【问题描述】:

我不是 SQL 专家,但我有一个存储过程查询来将记录插入表中。我的插入查询中有一个选择调用,将 NULL DateTime 字段替换为“”。但由于某种原因,它不起作用。插入后,数据库表中的 DateTime 字段仍为 NULL。有人可以看看下面的查询,让我知道清除 DateTime 字段的选择调用在同一个插入调用中是否有效。

CREATE PROC pCreate_DBQuery
( 
   @Message varchar(max),
   @DateTime smalldatetime
)
AS
BEGIN
    INSERT INTO dbo.TestTbl(Message, DateTime)
    VALUES (@Message, @DateTime)
    SELECT ISNULL(@ProcessedDateTime,'1900-01-01') AS [Changed Processed 
    Date]
    SELECT SCOPE_IDENTITY()
END

这个命令

EXEC pCreate_DBQuery 'None', NULL

插入的表格结果

None, NULL

【问题讨论】:

您不能将'' 存储在数据类型为date(或smalldatetime``datetime2 等)的列中。 '' 不是日期(时间)。这似乎是一个 xy 问题;手头的真正问题是什么? 如果数据类型是 DATETIME 则不能插入 '' 值(引号,空)。 为什么要替换 NULL?这没有意义。 您只能将其替换为有效的SMALLDATETIME 值。喜欢:SELECT ISNULL(@DateTime,'1900-01-01') AS [Changed Date] 编辑:请注意,ISNULL 函数已经用第二个参数替换了空值,REPLACE 是您查询中的多余尝试。 很多事情都错了,听起来像是 XY 问题。为什么你认为你想在你的DateTime 列中存储'' 而不是NULL?可能有更好的方法来做你真正想做的事情。 【参考方案1】:

REPLACE 不适用于NULL。如果你想插入值 19000101 如果值 NULL 被传递,你需要这样做:

INSERT INTO dbo.TestTbl(Message, DateTime)
SELECT @Message, ISNULL(@DateTime,'19000101');

不过,我个人仍然认为NULL 比日期19000101 更好。

如果你想要UPDATE,那么语法是:

UPDATE dbo.TestTbl
SET DateTime = '19000101'
WHERE DateTime IS NULL;

【讨论】:

INSERT 后面跟着VALUES,我猜@DateTime 值是他应该放在ISNULL 函数下的值。 好地方@B3S! (我盲目复制 OP 的代码得到了什么;哎呀)。 B3S,'INSERT后跟VALUES'是什么意思,VALUES语句不能跟在INSERT后面,必须在查询之前,否则会导致错误=)必须是像这样 INSERT INTO dbo.TestTbl(Message, DateTime) 后跟 VALUES (@Message, @DateTime) =) 我只想知道这个语句在哪里 SELECT ISNULL(@ProcessedDateTime,'1900-01-01') AS [已更改Processed Date] 将进入存储过程查询,因此如果我决定这样做,表会正确更新/替换字段。 我现在意识到 NULL 是最好的选择,但我只想知道如何更改字段,如果我需要稍后调用存储过程时。 INSERT 语句后面可以跟VALUES:您应该为将插入表中的每一行指定每一行和每个字段。 INSERT 后面也可以跟 SELECT 语句:在这种情况下,SELECT 的结果集必须包含 INSERT 指定的所有字段,或者,如果未指定,则包含所有表字段。现在假设您想在名为MyTable 的表中UPDATE 一个名为MyDate 的字段:您实际上不需要存储过程来执行此操作。您可以使用这种语法简单地编写更新语句:UPDATE MyTable SET MyDate = ISNULL(MyDate, '1900-01-01')

以上是关于SQL 存储过程查询以清除日期字段(如果为 NULL)的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize(或清除 SQL)查询以选择包含 JSON 字段中的值的行?

如何将一个字段中的日期与另一字段中的时间结合起来 - MS SQL Server

在sql数据库中如何筛选以日期为条件的记录

删除sql数据库列存储过程包括关系

请问修改表中的某一个日期类型的字段为当前系统时间的sql语句该如何书写。

sql存储过程从一张表中查询到的值作为另一张表的新的字段