使用 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)))