【问题标题】:Why does this SQL Server UPDATE statement throws a datetime conversion error?为什么此 SQL Server UPDATE 语句会引发日期时间转换错误?
【发布时间】:2015-09-16 00:20:11
【问题描述】:

我在尝试弄清楚如何使此更新正常工作时遇到了一些麻烦。

我认为我以前做过没有问题,但现在似乎不起作用。我不知道会发生什么变化。

当我执行此操作以及包含这些字段的任何类似更新语句时:

UPDATE Clientes 
SET CodigoComisionista = 450 
WHERE CodigoEmpresa = 1 
  AND CodigoCliente = '430002801';

我得到一个 varchar 到日期时间的转换错误:

SQL 错误 (3621): La conversión del tipo de datos varchar en datetime produjo un valor fuera de interval
Se terminó la instrucción.
受影响的行:0 找到的行:0 警告:0 1 个查询中 0 个的持续时间:0,000 秒。

查看那里的列类型,我看不出为什么会引发 datetime 转换。有什么想法吗?

select COLUMN_NAME, DATA_TYPE 
from INFORMATION_SCHEMA.COLUMNS IC 
where TABLE_NAME = 'Clientes' and 
(
COLUMN_NAME = 'CodigoEmpresa'
OR COLUMN_NAME = 'CodigoCliente'
OR COLUMN_NAME = 'CodigoComisionista'
)

=====>

"COLUMN_NAME"           "DATA_TYPE"
"CodigoEmpresa"         "smallint"
"CodigoCliente"         "varchar"
"CodigoComisionista"    "int"

谢谢!


这是与“Clientes”表关联的触发器:

USE [Sage]
GO
/****** Object:  Trigger [dbo].[Clientes_SyncIU]    Script Date: 15/09/2015 18:11:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Clientes_SyncIU] ON [dbo].[Clientes] AFTER INSERT, UPDATE 
                AS 
                BEGIN 
                    SET NOCOUNT ON; 

                    DECLARE @AppId AS INT 

                    SET @AppId = 0 

                    SELECT @AppId = sysAppId FROM SpidControlSync 
                    WHERE HostProcess = dbo.host_id_sage() AND sysHostName = dbo.host_name_sage()  
                    IF @AppId < 0 
                        BEGIN 
                            RETURN 
                        END


                        DECLARE @id uniqueidentifier
                        DECLARE @idPadre uniqueidentifier
                        DECLARE @linkId uniqueidentifier        
                        DECLARE @oldlinkId uniqueidentifier                         
                        DECLARE @tick int
                        DECLARE @codigoEmpresa int
                        DECLARE @modifiedDate datetime
                        DECLARE @accion VarChar(1)
                        DECLARE @fechaRegistro DATETIME

                        SET @tick = 1 -- by default


                        IF EXISTS(SELECT * FROM Inserted) AND EXISTS(SELECT * FROM Deleted) BEGIN
                            SET @accion = 'U'
                        END ELSE BEGIN
                            SET @accion = 'I'
                        END 

                        DECLARE cur_Inserted CURSOR FOR                         
                        SELECT Inserted.IdCliente, ci.sysLinkId, ci.sysModifiedDate , Inserted.CodigoEmpresa  FROM Inserted LEFT JOIN Clientes_Sync ci on Inserted.IdCliente=ci.sysGuidRegistro  
                        OPEN cur_Inserted
                        FETCH NEXT FROM cur_Inserted INTO  @id, @linkId, @modifiedDate, @codigoEmpresa 
                        WHILE @@FETCH_STATUS = 0   
                        BEGIN 
                                                                                                                IF @accion = 'U' AND (@linkId = '00000000-0000-0000-0000-000000000000' OR @linkId IS NULL) BEGIN
                                SET @linkId = @id
                            END
                            -- Call common SYNC Process PROC
                            EXEC  GEN_ProSyncProcess    @appid, 
                                                    @tick output,
                                                    'Clientes',
                                                    @modifiedDate output,
                                                    @fechaRegistro output

                            -- UPDATE SYNC columns on ClientesGCRMIntegration table. 
                            EXEC GEN_ProSyncMetadataInfo @appID,
                                                         @tick,
                                                         @modifiedDate,
                                                         'Clientes',
                                                         'Clientes_Sync',
                                                         @id,
                                                         'SysGuidRegistro',
                                                         @accion,
                                                         @fechaRegistro,@codigoEmpresa,@linkId
                            FETCH NEXT FROM cur_Inserted INTO  @id, @linkId, @modifiedDate, @codigoEmpresa END   
                            CLOSE cur_Inserted
                            DEALLOCATE cur_Inserted 


                END

【问题讨论】:

  • 可能触发?
  • 也许是这样,我对触发器一无所知,所以我必须调查一下。我已经发布了相关的触发器。
  • 如果触发器调用了一堆我们看不到的存储过程,我们真的无能为力。您应该能够通过自行执行触发器定义来重现错误(使用假插入/删除的表)。然后找出导致问题的存储过程,并查看它的主体。以同样的方式继续前进。

标签: sql sql-server


【解决方案1】:

也许 UPDATE 会创建一个重复的行。

【讨论】:

  • 那么错误应该是主键违规。我认为可以像 Evk 所说的那样触发。
  • 错误 3621 是:无法完成命令。这与日期时间转换无关。看看你之前有没有其他错误。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2019-07-22
  • 2016-10-16
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多