none
Concatenación variables tipo nvarchar incompleta RRS feed

  • Pregunta

  • Buen dia tengan todos.

    Tengo un store procedure que contiene un query dinamico, el problema que tengo es que cuando trato de concatenar las variables nvarchar (que contienen la consulta y condiciones) me doy cuenta que esa union esta incompleta, en otras palabras, se trunca la consulta a hasta cierto punto:

    CREATE PROCEDURE [dbo].[SP_MOSTRAR_EMP]
    @IDEMPLEADO INT = NULL,
    @NOMBRE NVARCHAR(50) = NULL,
    @APATERNO NVARCHAR (50) = NULL,
    @AMATERNO NVARCHAR (50) = NULL,
    @ESTATUS NVARCHAR(1) = NULL,
    @DEPARTAMENTO NVARCHAR(50) = NULL
    AS
    SET NOCOUNT ON;

    DECLARE @SELECCION NVARCHAR(4000)
    DECLARE @ORIGEN NVARCHAR(4000)
    DECLARE @CONDICIONES NVARCHAR(4000)
    DECLARE @CONSULTA NVARCHAR(4000)

    SET @SELECCION =   N'SELECT TOP(100) EMP.IdEmpleado AS NO_EMPLEADO,
       UP.NUniop AS EMPRESA,
       ES.NEstado AS ESTADO, --2
       MPIO.NMpio AS MUNICIPIO,
       RGRAL.NRuta AS RUTA,

                                       CANTIDAD N DE CAMPOS...' +CHAR(10)  //en este bloque hago la seleccion de campos (son 59)

                                       SET @ORIGEN = '
    FROM EMPLEADOS EMP
    INNER JOIN UOPERATIVAS UP ON(EMP.IdUniop = UP.IdUniop)
    INNER JOIN ESTADOS ES ON(ES.IdEstado = EMP.IdEstado)
    INNER JOIN MUNICIPIOS MPIO ON(MPIO.IdMpio = EMP.IdMpio)
    LEFT OUTER JOIN RUTAGRALS RGRAL ON(RGRAL.IdRuta = EMP.IdRuta)
    LEFT OUTER JOIN RUTADET RDET ON(RDET.NoReg = EMP.PtoRen)
    INNER JOIN PUESTOS PT ON(PT.IdPuesto = EMP.IdPuesto)
    INNER JOIN DEPARTAMENTOS DEP ON(DEP.IdDepto = EMP.IdDepto)
    INNER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''EMP'') LI1 ON(LI1.Valor =                                              EMP.TipoCont) --TIPO CONTRATO
    INNER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''EMP'') LI2 ON(LI2.Valor =                                              EMP.Sexo) -- SEXO
    INNER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''EMP'') LI3 ON(LI3.Valor =                                              EMP.EdoCivil) --ESTADO CIVIL
    INNER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''EMP'') LI4 ON(LI4.Valor =                                              EMP.Escolaridad) --ESCOLARIDAD
    INNER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''EMP'') LI5 ON(LI5.Valor =                                              EMP.FPago) --FORMA DE PAGO
    INNER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''EMP'') LI6 ON(LI6.Valor =                                              EMP.Estatus) --ESTATUS
    INNER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''CAT'') LI7 ON(LI7.Valor) =                                              CAST(EMP.Region AS varchar(1)) --REGION
    LEFT OUTER JOIN (SELECT Valor,DescVal FROM LISTVAL WHERE Modulo = ''EMP'') LI8 ON(LI8.Valor                                          = EMP.MotivoBaja) --MOTIVO BAJA
    INNER JOIN CATEGORIAS CAT ON(CAT.IdCategoria = EMP.Categoria AND CAT.IdPuesto =                                                        EMP.IdPuesto AND CAT.Region = EMP.Region)'
    + CHAR(10)  //aqui defino el origen de la informacion

                

    SET @CONDICIONES = 'WHERE 1 = 1' + CHAR(10)

    IF @IDEMPLEADO IS NOT NULL

    SET @CONDICIONES = @CONDICIONES + 'AND IdEmpleado = ' + QUOTENAME(@IDEMPLEADO,'') + ''


    IF @NOMBRE IS NOT NULL

    SET @CONDICIONES = @CONDICIONES + 'AND NEmpleado = ' + QUOTENAME(@NOMBRE,'') + ''


    IF @APATERNO IS NOT NULL

    SET @CONDICIONES = @CONDICIONES + 'AND APaterno = ' + QUOTENAME(@APATERNO,'') + ''


    IF @AMATERNO IS NOT NULL

    SET @CONDICIONES = @CONDICIONES + 'AND AMaterno = ' + QUOTENAME(@AMATERNO,'') + ''


    IF @ESTATUS IS NOT NULL

    SET @CONDICIONES = @CONDICIONES + 'AND Estatus = ' + QUOTENAME(@ESTATUS,'') + ''


    IF @DEPARTAMENTO IS NOT NULL

    SET @CONDICIONES = @CONDICIONES + 'AND Departamento = ' + QUOTENAME(@DEPARTAMENTO,'') + ''


    SET @CONSULTA = @SELECCION + @ORIGEN + @CONDICIONES  //Aqui concateno las variables nvarhar que conforman el cuerpo de la consulta dinamica

    print @CONSULTA //si yo imprimo el valor de la variable @CONSULTA, noto que el codigo se trunca hasta la ultima linea del bloque "ORIGEN", por lo tanto es imposible ejecutar el query, tal como se ve en la imagen

    lunes, 4 de noviembre de 2019 17:59

Respuestas

  • Muchas gracias.

    Encontré la falla al momento de concatenar, solo elimine los comentarios de mi codigo (--"comentarios") ya que estos eran los que hacían que excediera el numero permitido para almecenar un nvarchar.

    Como ultimo punto, es importante que la variable que contiene el cuerpo de la consulta sea nvarchar, ya que es el tipo que espera el sp.

    Saludos.

    lunes, 4 de noviembre de 2019 19:45

Todas las respuestas