none
Parametro en OPENQUERY RRS feed

  • Pregunta

  • Hola necesito ejecutar una consulta de una base de datos oracle utilizando un procedimiento almacenado y un OPENQUERY de sql Server

    por ejemplo

    select *  from  openquery(DB_ORACLE,'select campo from tablaOracle where filtro='''+@parametro+'''')


    el valor del atributo @parametro ingresa en el procedimiento almacenado pero  no logro hacer que funcione 

    Agradezco su ayuda.

    viernes, 15 de diciembre de 2017 20:20

Respuestas

  • Que tal. Claro, podrías tranquilamente usar el resultado del OpenQuery como un parámetro nuevamente para otra consulta.

    El procedure sp_executesql tiene como opción un parámetro del OUTPUT al cual le puedes devolver el valor.

    https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql



    Mariano K.

    viernes, 15 de diciembre de 2017 21:47
  • No, debes recuperar los resultados que retorna la consulta en -por ejemplo- una variable de tipo table, que será el conjunto de origen, por ejemplo:

    DECLARE @Temp table (campo1 int, campo2 int, campo3 int); -- Variable de tipo table
    DECLARE @Value nvarchar(100) = N'1';
    DECLARE @Query nvarchar(4000) = N'SELECT campo1, campo2, campo3 FROM 
        OPENQUERY(DB_ORACLE, ''SELECT campo FROM tablaOracle WHERE filtro = ' + @Value + ''')';
    INSERT INTO @Temp --Insertar el resultado a la variable de tipo table
    EXECUTE sp_executesql @Query;
    
    MERGE dbo.tabasql AS Target
    USING (SELECT campo1, campo2, campo3 FROM @Temp) AS Source --Utilizar la variable como origen
    ON ...


    viernes, 15 de diciembre de 2017 23:35

Todas las respuestas

  • Hola que tal. 

    Podrías armar en una variable la ejecución del select con el parámetro, y luego realizar un execute de esa variable, así:

    DECLARE @Statement NVARCHAR(300);
    DECLARE @parametro NVARCHAR(300);
    
    set @parametro = '1'
    SET @Statement = 'select *  from  openquery(DB_ORACLE,'+'''select campo from tablaOracle where filtro='+@parametro+''''+')'
    
    EXEC sp_executesq @statement
    Saludos.


    Mariano K.

    viernes, 15 de diciembre de 2017 20:52
  • Hola muchas gracias . el tema es que una vez que obtengo el registro del openquery requiere utilizarlo en un merge como table fuente 

    Merge SQLTABLA as target
    using 
    select *  from  openquery(DB_ORACLE,'select id ,ect,ect from tablaOracle where filtro='''+@parametro+'''') as source
    on target.id=source.id
    WHEN NOT MATCHED  then 

    xxxx .....

    Aplicaría la misma solución dada?... 

    Nuevamente .. Muchas Gracias


    viernes, 15 de diciembre de 2017 21:09
  • Que tal. Claro, podrías tranquilamente usar el resultado del OpenQuery como un parámetro nuevamente para otra consulta.

    El procedure sp_executesql tiene como opción un parámetro del OUTPUT al cual le puedes devolver el valor.

    https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql



    Mariano K.

    viernes, 15 de diciembre de 2017 21:47
  • Muchas gracias, ya pude montar mi consulta y verifico con el print para ver que tiene  y lo ejecuta bien pero a la hora de interactuar con el merge es donde no comprendo...

    EXEC sp_executesql @statement   -- listo

    merge dbo.tabasql as target
    using  (select @statement)   as source
    on target.id=source.id
    WHEN NOT MATCHED  then 

    esta seria a forma? porque finalmente la variable @statement es una cadena de texto y  no un objeto tabla o me equivoco 

    de esta manera el error obtenido es

    No column name was specified for column 1 of 'source'.

    Saludos..


    viernes, 15 de diciembre de 2017 23:05
  • No, debes recuperar los resultados que retorna la consulta en -por ejemplo- una variable de tipo table, que será el conjunto de origen, por ejemplo:

    DECLARE @Temp table (campo1 int, campo2 int, campo3 int); -- Variable de tipo table
    DECLARE @Value nvarchar(100) = N'1';
    DECLARE @Query nvarchar(4000) = N'SELECT campo1, campo2, campo3 FROM 
        OPENQUERY(DB_ORACLE, ''SELECT campo FROM tablaOracle WHERE filtro = ' + @Value + ''')';
    INSERT INTO @Temp --Insertar el resultado a la variable de tipo table
    EXECUTE sp_executesql @Query;
    
    MERGE dbo.tabasql AS Target
    USING (SELECT campo1, campo2, campo3 FROM @Temp) AS Source --Utilizar la variable como origen
    ON ...


    viernes, 15 de diciembre de 2017 23:35
  • Listo ya aplique sus recomendaciones y me funciono perfecto , muchas gracias por toda su ayuda 

    Saludos...

    sábado, 16 de diciembre de 2017 0:00
  • En este caso te recomiendo que uses un servidor ligado y uses marcadores de parametros para ser enviados mediante la sentencia EXEC ('cadena') AT (servidor_ligado).

    Tambien ten en cuenta cuantas filas traeras desde el servidor ligado y en dependencia de eso usar una variable tipo tabla o una tabla temporal con indices adecuados para soportar la sentencia MERGE.

    https://www.mssqltips.com/sqlservertip/1757/dynamic-sql-execution-on-remote-sql-server-using-exec-at/

    https://technet.microsoft.com/en-us/library/cc879317(v=sql.105).aspx


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 18 de diciembre de 2017 14:07