【问题标题】:Trouble using stored procedure to insert query results into table使用存储过程将查询结果插入表时出现问题
【发布时间】: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 数据类型:ArrivalDTSnapDate。 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 的 WHEREb.TransactionID IS NULL 并且因为 NULL 永远不会等于 NULL 那么不会从 TableB 返回任何行。
  • 您的查询看起来不错。也许你有一个导致问题的触发器。

标签: sql sql-server tsql


【解决方案1】:

根据我在您的 cmets 中看到的情况,您说您正在尝试从 TableA_test 插入 TableB。如果是这种情况,那么您的查询应该是:

INSERT INTO [Customer].[TableB] ([CustomerID],[VisitID],[TransactionId],[ArrivalDT],[DataA],[DataB],[DataC],[SnapDate]) 

SELECT
    a.CustomerID,   
    a.VisitID,
    a.TranactionID,
    a.ArrivalDT,
    a.DataA,
    a.DataB,
    a.DataC,
    SnapDate = GETDATE()

FROM [Customer].[TableA_test] a
LEFT JOIN [Customer].[TableB] b
    ON a.VisitID = b.VisitID
        AND a.TransactionId = b.TransactionID
WHERE b.TransactionID IS NULL

【讨论】:

  • SnapDate 将是上下文中的别名。以SELECT SnapDate = GETDATE(); 为例。
  • 感谢拉努的澄清。在这种情况下,我的回答将不适用。
  • 我仍然没有看到任何明显的查询问题。你@Larnu 吗?
  • 我认为我们缺少关键信息,例如 DDL、Sahari。
  • @Larnu:我将脚本从完整的存储过程中添加到帖子中。 :)
猜你喜欢
  • 2020-12-05
  • 1970-01-01
  • 2013-10-19
  • 2020-01-26
  • 2016-12-25
  • 2015-03-05
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多