2015-09-15 48 views
0

我在尝试弄清楚如何使此更新正常工作时遇到了一些麻烦。为什么此SQL Server UPDATE语句会引发日期时间转换错误?

我想我以前没有问题,但它似乎现在不工作。我不知道会发生什么变化。

当我执行此,任何类似的更新语句蒙山这些领域:

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

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

SQL Error (3621): La conversión del tipo de datos varchar en datetime produjo un valor fuera de intervalo
Se terminó la instrucción.
Affected rows: 0 Found rows: 0 Warnings: 0 Duration for 0 of 1 query: 0,000 sec.

望着列类型在那里我可以” t明白为什么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 
+9

可能触发? – Evk

+0

也许是这样,我对触发器一无所知,所以我必须研究这一点。我发布了关联的触发器。 – giorgiline

+3

如果触发器调用一堆我们看不到的存储过程,我们无法真正帮助。您应该能够通过自己执行触发器定义(使用伪插入/删除表)来重现错误。然后找出导致问题的存储过程,并查看其正文。继续以同样的方式进行。 – hvd

回答

-1

也许UPDATE创建重复行。

+0

那么错误应该是主键违规。我认为可能会触发Evk说。 – Utsav

+0

错误3621是:无法完成该命令。这不是关于日期时间转换。看看你之前是否还有其他错误。 –