none
¿Cómo utilizar SP_EXECUTESQL dentro de un procedimiento almacenado? RRS feed

  • Pregunta

  • Estimados buenos días,

    estoy intentando usar la función para consultas integradas de sql "SP_EXECUTESQL " donde le concateno la lectura a un documento XML que estoy pasando como parámetro en un procedimiento almacenado. Al momento de crear el procedimiento almacenado no me lanza ningún error; sin embargo al momento de ejecutar el procedimiento almacenado obtengo el siguiente mensaje de error de sql server 2017: 

    "SQL Error [195] [S0010]: 'data' no es un nombre de función integrada reconocido."

    A continuación muestro el código que he implementado para el procedimiento almacenado:

    CREATE PROCEDURE pa_registrar_actualizar_precio_x_producto
    (@xml XML)
    AS
    DECLARE @QUERY AS NVARCHAR(4000)
    SET @QUERY = ''

    SET @QUERY = @QUERY + N'SELECT '
    SET @QUERY = @QUERY + N'c.query('
    SET @QUERY = @QUERY + N'data(Ldprecios/CENDPrecio/PrecioMayorista)'
    SET @QUERY = @QUERY + N') as PrecioMayorista ' 
    SET @QUERY = @QUERY + N'FROM @xml.nodes('
    SET @QUERY = @QUERY + N'/ArrayOfCENCPrecio/CENCPrecio'
    SET @QUERY = @QUERY + N')as t(c)'

    EXEC SP_EXECUTESQL @QUERY

    Parámetros de ejecución del procedimiento almacenado:

    DECLARE @cadena XML
    SET @cadena =
    '<ArrayOfCENCPrecio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <CENCPrecio>
        <CodProducto>DETLAV0001</CodProducto>
        <DescProducto>DKL LIMPIATODO LAVANDA X 260</DescProducto>
        <Ldprecios>
          <CENDPrecio>      
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
          <CENDPrecio>       
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
          <CENDPrecio>        
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
          <CENDPrecio>
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
          <CENDPrecio>
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
       </Ldprecios>

      </CENCPrecio>
      <CENCPrecio>
        <CodProducto>DETLAV0002</CodProducto>
        <DescProducto>DKL LIMPIATODO BEBE X 260</DescProducto>
        <Ldprecios>
          <CENDPrecio>
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
          <CENDPrecio>   
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
          <CENDPrecio>
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>
          <CENDPrecio>
            <PrecioMayorista>12</PrecioMayorista>
          </CENDPrecio>   
        </Ldprecios>
      </CENCPrecio>
    </ArrayOfCENCPrecio>'
    EXEC pa_registrar_actualizar_precio_x_producto @cadena

    Error que obtengo en sql server 2017:

    "SQL Error [195] [S0010]: 'data' no es un nombre de función integrada reconocido."

    Alguna idea, tal ves la función integrada: SP_EXECUTESQL, no acepta el tipo de sintaxis que estoy usando para leer documentos XML?

    jueves, 9 de enero de 2020 16:48

Respuestas

  • Es problema de comillas. La expresión XQuery tiene que ir encerrada entre comillas simples. Las comillas que has escrito son las que forman el string para pasarlo a sp_executesql, pero dentro de ese string tiene que ir el xquery dentro de sus propias comillas. En SQL, para escribir las comillas dentro de las comillas hay que duplicar las comillas internas, así que quedará un poco feo:

    SET @QUERY = @QUERY + N'''data(Ldprecios/CENDPrecio/PrecioMayorista)'''

    jueves, 9 de enero de 2020 18:30

Todas las respuestas

  • Es problema de comillas. La expresión XQuery tiene que ir encerrada entre comillas simples. Las comillas que has escrito son las que forman el string para pasarlo a sp_executesql, pero dentro de ese string tiene que ir el xquery dentro de sus propias comillas. En SQL, para escribir las comillas dentro de las comillas hay que duplicar las comillas internas, así que quedará un poco feo:

    SET @QUERY = @QUERY + N'''data(Ldprecios/CENDPrecio/PrecioMayorista)'''

    jueves, 9 de enero de 2020 18:30
  • Gracias Alberto por tu respuesta. Ha sido de gran utilidad pues estaba entrampado con ese error que me salia.

    Muchas Gracias¡¡¡.

    miércoles, 15 de enero de 2020 12:16