none
Recibir parámetro como columna RRS feed

  • Pregunta

  • Buen dia a todos.

    Tengo el siguiente problema:

    Estoy tratando de hacer un store procedure que reciba 2 parametros, el primero seria la columna, y el segundo el valor del registro, por ejemplo..

    CREATE PROCEDURE [dbo].[SP_MOSTRAR_EMP]
    @CAMPO VARCHAR(20) = NULL, //Columna de la tabla empleado
    @VALOR VARCHAR (50) = NULL //Valor que contiene el registro, por ejemplo "Raul"
    AS
    SET NOCOUNT ON;

    SELECT  EMP.NOMBRE, EMP.EDAD, DEP.DEPARTAMENTO

    FROM EMPLEADOS EMP

    INNER JOIN DEPTOS DET ON(EMP.IDDEPTO = DEP.IDDEPTO)

    WHERE @CAMPO LIKE @VALOR OR @CAMPO IS NULL  //El parametro @CAMPO puede ser cualquier columna de la tabla empleados, que viaja desde un aplicativo en C#

    Desde el aplicativo estoy mandando los 2 parametros correctamente (Columna y valor) pero el store no me devuelve ninguna fila.

    Alguna sugerencia?

    Gracias de antemano!!


    viernes, 1 de noviembre de 2019 18:16

Respuestas

Todas las respuestas

  • Hagalo mediante un query dinamico, solo le hago la observacion que estos, no hacen uso de los indices

    CREATE PROCEDURE [dbo].[SP_MOSTRAR_EMP]
    @CAMPO VARCHAR(20) = NULL, //Columna de la tabla empleado
    @VALOR VARCHAR (50) = NULL //Valor que contiene el registro, por ejemplo "Raul"
    AS
    SET NOCOUNT ON;

    DECLARE @SQLString NVARCHAR(100)

    SET @SQLString = N'

    SELECT  EMP.NOMBRE, EMP.EDAD, DEP.DEPARTAMENTO

    FROM EMPLEADOS EMP

    INNER JOIN DEPTOS DET ON(EMP.IDDEPTO = DEP.IDDEPTO)

    WHERE ' + @CAMPO +' LIKE ' + @VALOR + ' OR ' + @CAMPO + ' IS NULL'  //El parametro @CAMPO puede ser cualquier columna de la tabla empleados, que viaja desde un aplicativo en C#

    EXEC SP_EXECUTESQL @SQLString


    IIslas Master Consultant SQL Server

    viernes, 1 de noviembre de 2019 19:03
  • Hola Cristian Mendoza Ramos:

    Una solución puede ser parecida a lo ya mostrado pero con algunos retoques.

    CREATE TABLE DEPTOS (
    IDDEPTO INT PRIMARY KEY, 
    DEPARTAMENTO VARCHAR(100)
    )
    GO
    CREATE TABLE EMPLEADOS (
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    NOMBRE VARCHAR(100), 
    EDAD INT, 
    IDDEPTO INT CONSTRAINT FK_DEPTO FOREIGN KEY (IDDEPTO) REFERENCES DEPTOS (IDDEPTO)
    )
    GO
    
    GO
    INSERT INTO dbo.DEPTOS(IDDEPTO, DEPARTAMENTO)
    VALUES
    (1,'DEP1'),
    (2,'DEP2'),
    (3,'DEP3'),
    (4,'DEP4');
    GO
    INSERT INTO EMPLEADOS (NOMBRE, EDAD, IDDEPTO)
    VALUES
    ('Carlos'	,18,1),
    ('Ernestina',18,4),
    ('Silverio'	,18,1),
    ('Felipe'	,18,2),
    ('Douglas'	,18,1),
    ('Xena'		,18,2),
    ('Olivia'	,18,1),
    ('Michelle'	,18,3),
    ('Berta'	,18,4);
    GO
    SELECT  EMP.NOMBRE, EMP.EDAD, DET.DEPARTAMENTO
    
    FROM EMPLEADOS EMP
    
    INNER JOIN DEPTOS DET ON(EMP.IDDEPTO = DET.IDDEPTO)
    GO
    CREATE OR ALTER PROCEDURE dbo.SP_MOSTRAR_EMP
    (@CAMPO VARCHAR(20) = NULL,
    @VALOR VARCHAR(50) = NULL
    )
    AS
    BEGIN
    	SET NOCOUNT ON;
    	DECLARE @SqlQuery NVarchar(4000);
    	Set @SqlQuery = N'SELECT  EMP.NOMBRE, EMP.EDAD, DET.DEPARTAMENTO
    							FROM EMPLEADOS EMP
    								INNER JOIN DEPTOS DET 
    								ON(EMP.IDDEPTO = DET.IDDEPTO)';
    	IF ((@CAMPO IS NOT NULL) AND (@VALOR IS NOT NULL))
    	BEGIN
    		SET @SqlQuery = @SqlQuery + N' 
    			WHERE '+@CAMPO + N' '
    			+ CASE WHEN @CAMPO = 'EDAD' THEN N'= '
    			       ELSE N'LIKE ''' END 
    			+ @VALOR 
    			+ + CASE WHEN @CAMPO = 'EDAD' THEN N';'
    			       ELSE N''';' END 
    	END
    EXEC SP_EXECUTESQL @SqlQuery;
    END

    Fijate que a la query dinámica, o más bien a lo que sería el string, se le anexa el predicado correspondiente a filtrar, pero como las cadenas llevan apóstrofes, y los números no, evaluamos esto con un case, para que ponga

    where nombre like 'minombre' o where edad = 18

    Luego con expresiones case, puedes ir completando todas las vicisitudes que se te ocurran, para hacer la sentencia más completa.

    EXEC SP_MOSTRAR_EMP 'DEPARTAMENTO', 'DEP1'

    EXEC SP_MOSTRAR_EMP 'NOMBRE', '%A%'

    EXEC SP_MOSTRAR_EMP 'EDAD', '18'

    sábado, 2 de noviembre de 2019 6:20
  • Hola iislas:

    solo le hago la observacion que estos, no hacen uso de los indices

    Me parece que esa impresión no es del todo correcta, hasta donde yo puedo evaluar.

    BEGIN TRAN
    
    EXEC SP_MOSTRAR_EMP 'DEPARTAMENTO', 'DEP1'
    
    ROLLBACK TRAN;

    Puedes ejecutar la query presentada, sobre el ejemplo que puse en la anotación anterior, con la opción de incluir el plan de ejecución actual.

    sábado, 2 de noviembre de 2019 6:24
  • Deleted
    sábado, 2 de noviembre de 2019 9:23
  • Gracias a todos por tomarse su tiempo en responder.
    lunes, 4 de noviembre de 2019 17:40