【发布时间】: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