使用 LINKED SERVER 从 SQL 插入到 ORACLE
Insert from SQL to ORACLE with LINKED SERVER
我在 sql 服务器 2008 中有下一个 SP。如果我从 SQL 服务器管理(右键单击,执行存储过程)执行此 SP,它没有任何问题,一切正确执行,但是从WEB(我的服务器外部的网页)调用此SP时,不会执行第3步。此步骤使用链接服务器到 Oracle 11G。
日志记录下一个错误:
Conversion failed when converting date and/or time from character
string
USE [Boton_Pago_Plus]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PC_Guarda_Transaccion]
(@id_intento int,@RUTSINGUION nchar(12),@valor_pagado numeric, @id_Servipag int, @datos_Servipag nchar(300))
AS
BEGIN
Set ANSI_NULLS ON;
Set ANSI_WARNINGS ON;
SET NOCOUNT ON;
BEGIN TRY
-- Insert statements for procedure here
DECLARE @RUTSINGUION VARCHAR(500);
DECLARE @INDEXRUT INT;
--STEP 1
INSERT INTO Transaccion (Rut_cliente,Valor_pagado,Id_servipag,Fecha_ingreso,Datos_servipag,Id_intento)
VALUES (@RUTSINGUION,@valor_pagado,@id_Servipag,GETDATE(),@datos_Servipag,@id_intento);
--STEP 2
UPDATE Intento SET Fecha_cierre = GETDATE(), Boleta = @id_Servipag where Id_intento = @id_intento;
--STEP 3
INSERT OPENQUERY (ORA_PEHUEN_PLUS_UTILS, 'SELECT * FROM METLIFE.BLACKLIST')
VALUES (@RUTSINGUION,'METLF','CL',1,NULL,CONVERT(VARCHAR(10), GETDATE(), 103),DATEADD(DAY,5, CONVERT(VARCHAR(10), GETDATE(), 103))
,'servipag',CONVERT(VARCHAR(10), GETDATE(), 103),'PAGO SERVIPAG','Inhibido 5 dias pago servipag')
END TRY
BEGIN CATCH
INSERT INTO LOG_ERROR
(
NUMERO_ERROR ,
SEVERIDAD_ERROR ,
ESTADO_ERROR ,
PROCEDIMIOENTO ,
LINEA_ERROR ,
MENSAJE,
FECHA_ERROR
)
SELECT ERROR_NUMBER() AS errNumber
, ERROR_SEVERITY() AS errSeverity
, ERROR_STATE() AS errState
, ERROR_PROCEDURE() AS errProcedure
, ERROR_LINE() AS errLine
, ERROR_MESSAGE() AS errMessage,
GETDATE()
END CATCH
END
您的查询中的问题,第 3 步,看起来您正在将日期转换为字符串,然后尝试对该字符串执行 DATEADD
。如果在转换为字符串之前执行 DATEADD
会更安全。
之前:(在您的 VALUES 子句中间)
DATEADD(DAY,5, CONVERT(VARCHAR(10), GETDATE(), 103))
修复:
CONVERT(VARCHAR(10), DATEADD(DAY, 5, GETDATE()), 103)
我使用转换格式 varchar 将 varchar 发送到插入。此行发送不带小时的日期,并且有效。
DATEADD(DAY,5,(CAST(GETDATE() AS date)))
我在 sql 服务器 2008 中有下一个 SP。如果我从 SQL 服务器管理(右键单击,执行存储过程)执行此 SP,它没有任何问题,一切正确执行,但是从WEB(我的服务器外部的网页)调用此SP时,不会执行第3步。此步骤使用链接服务器到 Oracle 11G。 日志记录下一个错误:
Conversion failed when converting date and/or time from character string
USE [Boton_Pago_Plus]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PC_Guarda_Transaccion]
(@id_intento int,@RUTSINGUION nchar(12),@valor_pagado numeric, @id_Servipag int, @datos_Servipag nchar(300))
AS
BEGIN
Set ANSI_NULLS ON;
Set ANSI_WARNINGS ON;
SET NOCOUNT ON;
BEGIN TRY
-- Insert statements for procedure here
DECLARE @RUTSINGUION VARCHAR(500);
DECLARE @INDEXRUT INT;
--STEP 1
INSERT INTO Transaccion (Rut_cliente,Valor_pagado,Id_servipag,Fecha_ingreso,Datos_servipag,Id_intento)
VALUES (@RUTSINGUION,@valor_pagado,@id_Servipag,GETDATE(),@datos_Servipag,@id_intento);
--STEP 2
UPDATE Intento SET Fecha_cierre = GETDATE(), Boleta = @id_Servipag where Id_intento = @id_intento;
--STEP 3
INSERT OPENQUERY (ORA_PEHUEN_PLUS_UTILS, 'SELECT * FROM METLIFE.BLACKLIST')
VALUES (@RUTSINGUION,'METLF','CL',1,NULL,CONVERT(VARCHAR(10), GETDATE(), 103),DATEADD(DAY,5, CONVERT(VARCHAR(10), GETDATE(), 103))
,'servipag',CONVERT(VARCHAR(10), GETDATE(), 103),'PAGO SERVIPAG','Inhibido 5 dias pago servipag')
END TRY
BEGIN CATCH
INSERT INTO LOG_ERROR
(
NUMERO_ERROR ,
SEVERIDAD_ERROR ,
ESTADO_ERROR ,
PROCEDIMIOENTO ,
LINEA_ERROR ,
MENSAJE,
FECHA_ERROR
)
SELECT ERROR_NUMBER() AS errNumber
, ERROR_SEVERITY() AS errSeverity
, ERROR_STATE() AS errState
, ERROR_PROCEDURE() AS errProcedure
, ERROR_LINE() AS errLine
, ERROR_MESSAGE() AS errMessage,
GETDATE()
END CATCH
END
您的查询中的问题,第 3 步,看起来您正在将日期转换为字符串,然后尝试对该字符串执行 DATEADD
。如果在转换为字符串之前执行 DATEADD
会更安全。
之前:(在您的 VALUES 子句中间)
DATEADD(DAY,5, CONVERT(VARCHAR(10), GETDATE(), 103))
修复:
CONVERT(VARCHAR(10), DATEADD(DAY, 5, GETDATE()), 103)
我使用转换格式 varchar 将 varchar 发送到插入。此行发送不带小时的日期,并且有效。
DATEADD(DAY,5,(CAST(GETDATE() AS date)))