none
ejecutar una funcion dentro de un procedimiento almacenado RRS feed

  • Pregunta

  • Buenos tardes amigos:

    Antes  de empezar a decir mi dilema le doy las gracias por ser tan amables en este foro:

    tengo la siguiente funcion que sirve para  consultar npalabras de un texto

    CREATE FUNCTION [dbo].[ConsultaNPalabraTexto] (@texto VARCHAR(4096), @nPalabra TINYINT)  
    RETURNS VARCHAR(255)
    AS
    BEGIN 
    DECLARE @ncPalabra TINYINT,
    @pos SMALLINT,
    @posA SMALLINT,
    @palabra VARCHAR(255)

    SET @pos=1
    SET @posA=1
    SET @ncPalabra=0
    SET @palabra=''
    WHILE CHARINDEX(' ', @texto, @posA)>0
    BEGIN
    SET @pos=CHARINDEX(' ', @texto, @posA)
    IF SUBSTRING(@texto,@posA,1)<>' '
    BEGIN
    SET @ncPalabra=@ncPalabra+1
    IF @ncPalabra=@nPalabra 
    BEGIN
    SET @palabra=SUBSTRING(@texto,@posA,@pos-@posA)
    BREAK
    END
    END
    SET @posA=@pos+1
    END
    IF @posA<LEN(@texto)
    BEGIN
    SET @ncPalabra=@ncPalabra+1
    IF @ncPalabra=@nPalabra
    SET @palabra=SUBSTRING(@texto,@posA,LEN(@texto)-@posA+1)
    END

    RETURN @palabra
    END

    HASTA AHI TODO BIEN 

    AHORA QUIERO USAR ESTA FUNCION EN UN PROCEDIMIENTO ALMACENADO PARA BUSCAR LOS VENDEDORES. MI PROCEDIMIENTO ALMACENADO ES LO SIGUIENTE :

    ALTER PROCEDURE [dbo].[ConsultaVendedoresNombre]
    @pNom_Vendedor VARCHAR(50),
    @pActivos BIT
    AS
    SELECT *
    FROM Vendedores
    WHERE Nom_Vendedor LIKE @pNom_Vendedor+'%' AND Activo>=@pActivos
    ORDER BY Nom_Vendedor

    -----------------------------------

    me pueden decir si es posible llamar a la funcion que escribe al inicio  en este procedimiento almacenado para que me busque los vendedores que tengas las palabras que ingrese:

    por si no se pueda como hacerlo desde c# . espera a la espera de su amable respuesta .

    lunes, 22 de octubre de 2012 22:05

Respuestas

  • Te indique anteriormente que la funcion la puede invocar en cualquier parte del codigo

    CREATE PROC BUSCAR_PRODUCTOS
    @NOM_PROD VARCHAR (100),
    @pActivos bit
    AS
    SELECT *
    FROM PRODUCTOS
    WHERE NOM_PROD LIKE '%' + select [SchemaName].[FunctionName] (@NOM_PROD) + '%' AND Activo>=@pActivos
    ORDER BY NOM_PROD 
    



    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    Blog

    • Marcado como respuesta Robin Ramirez viernes, 26 de octubre de 2012 17:36
    viernes, 26 de octubre de 2012 17:13
  • Hola.

    Decir que el empleo de esa función es efectivo es, cuando menos discutible. Y además, no es tampoco especialmente práctico. La función Patindex ya hace exactamente eso. Sólo tienes que preparar el procedimiento para que acepte varios parámetros (tantos como palabras quieras que se puedan introducir) y luego lo consultas:

    --Primero, para las palabras sin rellenar, indico un comodín
    select 
      @palabra1 = isnull(@palabra1, '%'),
      @palabra2 = isnull(@palabra2, '%'),
      @palabra3 = isnull(@palabra3, '%')
    
    --Y luego ya filtro para obtener aquellos registros que cumplan todos los requisitos
    select Campo1, Campo2, Campo3
    from PRODUCTOS
    where Activo >= @pActivos and
      Patindex(@palabra1, NOM_PROD) > 0 and
      Patindex(@palabra2, NOM_PROD) > 0 and
      Patindex(@palabra3, NOM_PROD) > 0
      

    Y en cualquier caso, si lo que quieres es emplear una función en tu procedimiento, nada te lo impide. Si es una función escalar empleándola en el "Where", has de hacerlo exactamente igual que con Patindex, por ejemplo:

    Select Campo1, Campo2, Campo3
    from PRODUCTOS
    where Campo1 = dbo.MiFuncion(Campo2)

    Si tienes dudas, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    • Marcado como respuesta Robin Ramirez jueves, 24 de enero de 2013 3:37
    viernes, 26 de octubre de 2012 17:48
    Moderador

Todas las respuestas

  • Para llamar una fucion desde qualquier parte del SP debe hacer algo como esto

    select [SchemaName].[FunctionName] (Param1, Param2....);
    
    o
    
    DECLARE	@return_value int
    
    EXEC	@return_value = [SchemaName].[FunctionName] (Param1, Param2....)
    
    SELECT	'Return Value' = @return_value
    
    GO
    
    
    


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    Blog

    lunes, 22 de octubre de 2012 22:56
  • Fijate en este link para conocer un poco sobre funciones, los tipos que hay y como se invocan..

    http://www.devtroce.com/2010/01/18/crear-e-invocar-funciones-udf-en-sql-server/

    • Propuesto como respuesta Sergio S Arias martes, 23 de octubre de 2012 18:32
    lunes, 22 de octubre de 2012 23:00
  • Pues yo uso funciones todo el tiempo en T-SQL y se usan igual que en otros lenguajes:  Set variable = función().  Es más, su función usa funciones de SQL como Substring().  Se usan de forma idéntica.

    Jose R. MCP
    Code Samples

    martes, 23 de octubre de 2012 0:12
  • hola,  le explico aca esta mi procedimiento almacenado

    CREATE PROCEDURE [dbo].[ConsultaVendedoresNombre]

    @pNom_Vendedor VARCHAR(50),
    @pActivos  BIT
    AS
    SELECT *
    FROM Vendedores
    WHERE Nom_Vendedor LIKE @pNom_Vendedor+'%' AND Activo>=@pActivos
    ORDER BY Nom_Vendedor

    la idea de usar la funcion en que cuando el usuario busca vendedores con tan solo escribir una letra ya le liste los vendedores que tengan esa letra por ello  la funcion que le escribo es para que empiece a buscar palabras :

    CREATE FUNCTION [dbo].[ConsultaNPalabraTexto] (@texto VARCHAR(4096), @nPalabra TINYINT)  
    RETURNS VARCHAR(255)
    AS
    BEGIN 
    DECLARE @ncPalabra TINYINT,
    @pos SMALLINT,
    @posA SMALLINT,
    @palabra  VARCHAR(255)

    SET @pos=1
    SET @posA=1
    SET @ncPalabra=0
    SET @palabra=''
    WHILE CHARINDEX(' ', @texto, @posA)>0
    BEGIN
    SET @pos=CHARINDEX(' ', @texto, @posA)
    IF SUBSTRING(@texto,@posA,1)<>' '
    BEGIN
    SET @ncPalabra=@ncPalabra+1
    IF @ncPalabra=@nPalabra 
    BEGIN
    SET @palabra=SUBSTRING(@texto,@posA,@pos-@posA)
    BREAK
    END
    END
    SET @posA=@pos+1
    END
    IF @posA<LEN(@texto)
    BEGIN
    SET @ncPalabra=@ncPalabra+1
    IF @ncPalabra=@nPalabra
    SET @palabra=SUBSTRING(@texto,@posA,LEN(@texto)-@posA+1)
    END

    RETURN @palabra
    END

    -----------------------------------

    la pregunta es como llamo desde el procedimiento almacenado  "consultarvendedornombre" como invoco a esa función para que me empiece a buscar los nombres de los vendedores por cada palabra que ingrese.

    jueves, 25 de octubre de 2012 21:11
  • Hola.

    Para eso no te hace falta invocar a una función, con lo que ya tienes en el procedimiento (filtro con like) obtendrías el resultado que buscas. ¿Qué quieres obtener usando la función que no obtienes ya con el procedimiento almacenado?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 26 de octubre de 2012 9:02
    Moderador
  • Hola.

    Para eso no te hace falta invocar a una función, con lo que ya tienes en el procedimiento (filtro con like) obtendrías el resultado que buscas. ¿Qué quieres obtener usando la función que no obtienes ya con el procedimiento almacenado?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    claro entiendo como funciona el like te hago un ejemplo para que veas porque quiero usar la funcion que cree anteriormente.

    hagamos el ejemplo con productos:

    tengo un producto que tiene esta descripción:

    • PISO-FSB-SOLUBLE SALT-W6S157-HUESO-60X60 1ERA 
    • PISO-FSB-SOLUBLE SALT-W6S222-HUESO-60X60 1ERA
    • PISO-SAV-PERUIBE-BLANCO EXTRA-40X40 1ERA.

    con   "like"  si lo defino de esta manera:

    select * from productos where nom_prod like'%'+@nom_prod+'%'

    y al hacer el ingreso de esta manera:  SOLU W622 HUESO

    COMO RESULTADO NO ME ARROJARA NADA POR CON ESE LIKE LE ESTOY DICIENDO QUE ME BUSQUE TODO PRODUCTO QUE TENGA CUALQUIER LETRA O PALABRAS AL INICIO Y AL FIN . LO 

    CON LA FUNCIÓN EL RESULTADO SERIA DE LA SIGUIENTE MANERA 

    ENTRADA: SOLU W622 HUESO

    RESULTADO: PISO-FSB-SOLUBLE SALT-W6S222-HUESO-60X60 1ERA

    POR QUE LA FUNCIÓN COMPARA LETRA POR LETRA DE CADA DESCRIPCIÓN DEL PRODUCTO POR ESO ES MAS EFECTIVOS

    ----------------------------------------------------------------------

    POR ELLO PORFAVOR SI FUERAN TAN AMABLES ME DIGAN COMO LLAMAR A UNA FUNCION DESDE MI PRODECIMIENTO ALMACENDO YA PLANTEADO ANTERIORMENTE.

    FUNCION:

    CREATE FUNCTION [dbo].[ConsultaNPalabraTexto] (@texto VARCHAR(4096), @nPalabra TINYINT)  
    RETURNS VARCHAR(255)
    AS
    BEGIN 
    DECLARE @ncPalabra	TINYINT,
    		@pos		SMALLINT,
    		@posA		SMALLINT,
    		@palabra	VARCHAR(255)
    		
    SET @pos=1
    SET @posA=1
    SET @ncPalabra=0
    SET @palabra=''
    WHILE CHARINDEX(' ', @texto, @posA)>0
    BEGIN
    	SET @pos=CHARINDEX(' ', @texto, @posA)
    	IF SUBSTRING(@texto,@posA,1)<>' '
    	BEGIN
    		SET @ncPalabra=@ncPalabra+1
    		IF @ncPalabra=@nPalabra 
    		BEGIN
    			SET @palabra=SUBSTRING(@texto,@posA,@pos-@posA)
    			BREAK
    		END	
    	END
    	SET @posA=@pos+1
    END
    IF @posA<LEN(@texto)
    BEGIN
    	SET @ncPalabra=@ncPalabra+1
    	IF @ncPalabra=@nPalabra
    		SET @palabra=SUBSTRING(@texto,@posA,LEN(@texto)-@posA+1)
    END
    
    RETURN @palabra
    END
    

    PROCEDIMIENTO ALMACENADO

    CREATE PROC BUSCAR_PRODUCTOS
    @NOM_PROD VARCHAR (100),
    @pActivos bit
    AS
    SELECT *
    FROM PRODUCTOS
    WHERE NOM_PROD LIKE @NOM_PROD+'%' AND Activo>=@pActivos
    ORDER BY NOM_PROD 

    viernes, 26 de octubre de 2012 14:21
  • Te indique anteriormente que la funcion la puede invocar en cualquier parte del codigo

    CREATE PROC BUSCAR_PRODUCTOS
    @NOM_PROD VARCHAR (100),
    @pActivos bit
    AS
    SELECT *
    FROM PRODUCTOS
    WHERE NOM_PROD LIKE '%' + select [SchemaName].[FunctionName] (@NOM_PROD) + '%' AND Activo>=@pActivos
    ORDER BY NOM_PROD 
    



    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    Blog

    • Marcado como respuesta Robin Ramirez viernes, 26 de octubre de 2012 17:36
    viernes, 26 de octubre de 2012 17:13
  • Hola.

    Decir que el empleo de esa función es efectivo es, cuando menos discutible. Y además, no es tampoco especialmente práctico. La función Patindex ya hace exactamente eso. Sólo tienes que preparar el procedimiento para que acepte varios parámetros (tantos como palabras quieras que se puedan introducir) y luego lo consultas:

    --Primero, para las palabras sin rellenar, indico un comodín
    select 
      @palabra1 = isnull(@palabra1, '%'),
      @palabra2 = isnull(@palabra2, '%'),
      @palabra3 = isnull(@palabra3, '%')
    
    --Y luego ya filtro para obtener aquellos registros que cumplan todos los requisitos
    select Campo1, Campo2, Campo3
    from PRODUCTOS
    where Activo >= @pActivos and
      Patindex(@palabra1, NOM_PROD) > 0 and
      Patindex(@palabra2, NOM_PROD) > 0 and
      Patindex(@palabra3, NOM_PROD) > 0
      

    Y en cualquier caso, si lo que quieres es emplear una función en tu procedimiento, nada te lo impide. Si es una función escalar empleándola en el "Where", has de hacerlo exactamente igual que con Patindex, por ejemplo:

    Select Campo1, Campo2, Campo3
    from PRODUCTOS
    where Campo1 = dbo.MiFuncion(Campo2)

    Si tienes dudas, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    • Marcado como respuesta Robin Ramirez jueves, 24 de enero de 2013 3:37
    viernes, 26 de octubre de 2012 17:48
    Moderador