【发布时间】:2016-08-03 15:29:05
【问题描述】:
我似乎无法使用输出参数将日期时间值插入表中。
我收到以下错误。
从字符串转换日期和/或时间时转换失败。
我的合并语句如下。如果我在没有 INTO 子句的情况下运行 SQL,则不会出现错误。屏幕上显示的输出包括在下面。
我已经尝试了所有可以看到的 CAST 和 Convert 变体,但仍然出现相同的错误。我可以使用常规插入命令成功地将记录插入到表中,日期值由 Getdate() 提供,或者使用下面 ascii 表中显示的日期格式的带引号的文本。
new_createdate 和 old_createdate 列是我的变更日志表中的 dattime。
我不知道为什么从插入和删除返回的日期似乎不想进入没有此错误的表。
MERGE jobtbl PJP
USING myjobtbl CPI
ON PJP.jobnum = CPI.jobnum
WHEN MATCHED THEN
UPDATE
SET PJP.customer = CPI.customer,
PJP.createdate = CPI.createdate,
WHEN NOT MATCHED BY TARGET THEN
INSERT
(jobnum,
customer,
createdate)
VALUES
(cpi.jobnum,
cpi.customer,
cpi.createdate)
OUTPUT
$ACTION action,
inserted.jobnum jobnumcol,
inserted.createdate new_createdate,
deleted.createdate old_createdate,
inserted.customer new_customer,
deleted.customer old_customer,
INTO [dbo].[changeLog];
+-------+------+--------------------+--------------------+---------+--------+
|action |jobnum| new_createdate | old_createdate |new_cust |old_cust|
+-------+-----+---------------------+--------------------+---------+--------+
|UPDATE |169853| 2016-06-17 13:34:00| 2016-06-17 13:34:00| CHIENE |CHIENE |
|UPDATE |169743| 2016-05-20 14:07:00| 2016-05-20 14:07:00| DOZJOS |DOZJOS |
+-------+------+--------------------+--------------------+---------+--------+
【问题讨论】:
-
您的
changeLog表的结构是否与OUTPUT中的列顺序匹配?你能发布表格 DDL 吗? -
我相信是的。即使我在输出子句中明确命名列,列顺序是否重要?更改日志表中的每一列是否都必须包含在插入和删除的语句中?
-
我相信是这样,因为你只是给他们一个别名。你能发布你的changeLog表的
CREATE TABLE脚本吗? -
我检查了一下,确实有一列乱序。这似乎是问题所在。我是第一次使用输出和合并,所以在此过程中我犯了一些错误。我有点困惑,为什么列列表中的顺序很重要,因为每个列都被明确命名,例如 insert.jobnum、deleted.jobnum 等。我理解这些来自 SQL Server 中的某种内存或临时表。不确定我是否可以在评论中将您的答案标记为正确答案,但这是正确答案。列顺序很重要。
-
作为答案提交。
标签: sql-server tsql datetime merge output