我在尝试弄清楚如何使此更新正常工作时遇到了一些麻烦。为什么此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
可能触发? – Evk
也许是这样,我对触发器一无所知,所以我必须研究这一点。我发布了关联的触发器。 – giorgiline
如果触发器调用一堆我们看不到的存储过程,我们无法真正帮助。您应该能够通过自己执行触发器定义(使用伪插入/删除表)来重现错误。然后找出导致问题的存储过程,并查看其正文。继续以同样的方式进行。 – hvd