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