【发布时间】:2019-04-13 00:17:52
【问题描述】:
我正在尝试对某些表进行一些测试,但我似乎一直遇到错误。
我正在尝试运行以下存储过程:
INSERT INTO [Customer].[TableA_test] ([CustomerID], [VisitID], [TransactionId], [ArrivalDT], [DataA], [DataB], [DataC], [SnapDate])
SELECT
b.CustomerID,
b.VisitID,
b.TransactionID,
b.ArrivalDT,
b.DataA,
b.DataB,
b.DataC,
SnapDate = GETDATE()
FROM
[Customer].[TableA_test] a
LEFT JOIN
[Customer].[TableB] b ON a.VisitID = b.VisitID
AND a.TransactionId = b.TransactionID
WHERE
a.TransactionID IS NULL
该过程旨在从查询中获取结果并将它们插入到 TableA 中。表 A 具有与表 B 完全相同的列和数据类型。当我尝试执行存储过程(上面提供的代码)时,出现以下错误:
消息 241,级别 16,状态 1,过程 InsertTo_TableA_test,第 27 行
从字符串转换日期和/或时间时转换失败。
我所有的日期列都设置为datetime 数据类型:ArrivalDT 和SnapDate。 TableA_testing 和 TableB 具有完全相同的列名和数据类型。
我有什么遗漏吗?
这是 [Customer].[TableA_test] 的表格信息:
CREATE TABLE [Customer].[TableA_test]
(
[TransactionID] [VARCHAR](254) NULL,
[VisitID] [VARCHAR](254) NULL,
[ArrivalDT] [DATETIME] NULL,
[CustomerID] [VARCHAR](254) NULL,
[DataA] [VARCHAR](50) NULL,
[DataB] [VARCHAR](50) NULL,
[DataC] [VARCHAR](50) NULL,
[SnapDate] [DATETIME] NULL
)
对于表 B:
CREATE TABLE [Customer].[TableB]
(
[TransactionID] [VARCHAR](254) NULL,
[VisitID] [VARCHAR](254) NULL,
[ArrivalDT] [DATETIME] NULL,
[CustomerID] [VARCHAR](254) NULL,
[DataA] [VARCHAR](50) NULL,
[DataB] [VARCHAR](50) NULL,
[DataC] [VARCHAR](50) NULL,
[SnapDate] [DATETIME] NULL
)
我的存储过程的第 27 行是:
INSERT INTO [Customer].[JTM_NY_SPARCS_VitalSigns_test] ([CustomerID],[VisitID], [TransactionID], [ArrivalDT], [DataA], [DataB], [DataC], [SnapDate])
这是存储过程的完整读数:
USE [Database_3]
GO
/****** Object: StoredProcedure [Customer].[InsertTo_TableA_test] Script Date: 4/12/2019 11:49:17 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [Customer].[InsertTo_TableA_test]
/*
CREATED: 04/11/2019
*/
AS
BEGIN
INSERT INTO [Customer].[TableA_test] ([CustomerID], [VisitID], [TransactionId], [ArrivalDT], [DataA], [DataB], [DataC], [SnapDate])
SELECT
b.CustomerID,
b.VisitID,
b.TransactionID,
b.ArrivalDT,
b.DataA,
b.DataB,
b.DataC,
SnapDate = GETDATE()
FROM
[Customer].[TableA_test] a
LEFT JOIN
[Customer].[TableB] b ON a.VisitID = b.VisitID
AND a.TransactionId = b.TransactionID
WHERE
a.TransactionID IS NULL
END
GO
从存储过程运行查询时的一行结果示例:
100010 [VisitID]
20000281542 [TransactionID]
2014-07-09 15:44:42.000 [ArrivalDT]
0032011 [CustomerID]
147 [DataA]
71 [DataB]
69 [DataC]
2019-04-12 11:54:23.753 [SnapDate]
【问题讨论】:
-
该语句是否符合您的预期?如果在表
TableB中没有加入行(匹配来自TableA_test),它会将数据从表[TableB]插入表TableA_test。这只会插入一堆NULL值(除了SnapDate将插入GETDATE()的当前值)。 -
@Larnu 他正在将
[Customer].[TableB]中的数据插入TableA_Test,查看Select中的别名 -
不完全是。我的代码可能有问题。我正在尝试将 TableA_test 中的一堆数据移至 TableB。我加入 TableB 是为了排除任何重复的行。
-
他是@RyanWilson 是的,但他的
FROM是[Customer].[TableA_test],在[TableB]上带有LEFT JOIN,特别是在a.TransactionId = b.TransactionID上(这很重要)。 OP 的WHERE是b.TransactionID IS NULL并且因为NULL永远不会等于NULL那么不会从TableB返回任何行。 -
您的查询看起来不错。也许你有一个导致问题的触发器。
标签: sql sql-server tsql