none
Usar Like em execute sp_executeSQL RRS feed

  • Pergunta

  • Olá a todos mas uma vez venho recorrer a voces caros colegas desenvolvedores bom meu problema é o seguinte

    eu tenho uma procedure em sql q monda uma select dinamicamente soah q eu qria usar o like nela pois não estou

    conseguindo concatenar a minha instrução algum dos Sr(s). poderia me dar uma mão quanto a isto vou postar a

    procedure aqui e se alguém puder me ajudar a concatenar ela e colocar o like sou grato

    bom a procedure é a seguinte:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE FiltrarValidadorBusca
    	@Mascara BIGINT,
    	@WLAN VARCHAR(50),
    	@RC VARCHAR(50),
    	@PREFIXO BIGINT,
    	@STATUS TINYINT
    AS
    BEGIN
    	DECLARE @concat INT = 0
    	DECLARE @strConcat NVARCHAR(7)
    	DECLARE @cmdSQL NVARCHAR(2000)
    	IF(@PREFIXO <> 0) BEGIN
    		set @cmdSQL = 'SELECT C.Prefixo, 
    							V.ValidadorID, 
    							V.Mascara, 
    							V.Rc, V.Wlan, 
    							tv.DESCRICAO 
    							FROM tblValidadoresPiedade V 
    							INNER JOIN tblCarrosPiedade C 
    							ON C.ValidadorID = V.ValidadorID 
    							INNER JOIN tblStatusValidador tv 
    							ON tv.statusID = V.StatusID
    							WHERE C.PREFIXO LIKE '+ CONVERT(nvarchar, @PREFIXO, 111)+'%'
    	END 
    	ELSE BEGIN
    		SET @cmdSQL = 'SELECT C.Prefixo, 
    								V.ValidadorID, 
    								V.Mascara, 
    								V.Rc, V.Wlan, 
    								tv.DESCRICAO 
    								FROM tblValidadoresPiedade V 
    								INNER JOIN tblCarrosPiedade C 
    								ON C.ValidadorID = V.ValidadorID 
    								INNER JOIN tblStatusValidador tv 
    								ON tv.statusID = V.StatusID '		
    		
    		IF(@Mascara <> 0) BEGIN
    			IF(@concat = 0)BEGIN
    				SET @strConcat = ' WHERE '
    				SET @concat = 1
    			END
    			ELSE BEGIN
    				SET @strConcat = ' OR '
    				SET @concat = 1
    			END
    			SET @cmdSQL += @strConcat + 'v.mascara LIKE '+ CONVERT(NVARCHAR, @Mascara,111)+'%'''
    		END
    		IF(@WLAN <> '') BEGIN
    			IF(@concat = 0)BEGIN
    				SET @strConcat = ' WHERE '
    				SET @concat = 1
    			END
    			ELSE BEGIN
    				SET @strConcat = ' AND '
    				SET @concat = 1
    			END
    			SET @cmdSQL += @strConcat + 'v.WLAN LIKE '+CONVERT(NVARCHAR, @WLAN,111)+ '%'''
    		END
    		IF(@RC <> '') BEGIN
    			IF(@concat = 0)BEGIN
    				SET @strConcat = ' WHERE '
    				SET @concat = 1
    			END
    			ELSE BEGIN
    				SET @strConcat = ' OR '
    				SET @concat = 1
    			END
    			SET @cmdSQL += @strConcat + 'v.Rc LIKE '+CONVERT(VARCHAR, @RC,111)+'%'''
    		END
    		
    		IF(@STATUS <> 0) BEGIN
    			IF(@concat = 0)BEGIN 
    				SET @strConcat = ' WHERE '
    				SET @concat = 1
    			END
    			ELSE BEGIN
    				SET @strConcat = ' OR '
    				SET @concat = 1
    			END
    			SET @cmdSQL += @strConcat + 'tv.StatusID LIKE ' + CONVERT(VARCHAR, @STATUS,111)+'%'''
    		END
    	END
    	execute sp_executesql @cmdSQL
    END
    
    select * from tblValidadoresPiedade inner join tblStatusValidador on tblValidadoresPiedade.StatusID = tblStatusValidador.statusID
    

    Como deixar o like funcional nessa query

    grato a todos 


    Att Edney Desenvolvedor C#, WindowsForms, Asp.Net WebForms, Asp.Net MVC
    terça-feira, 23 de novembro de 2010 11:54

Respostas

  • Edney,

    Tente essa:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE FiltrarValidadorBusca
        @Mascara BIGINT,
        @WLAN VARCHAR(50),
        @RC VARCHAR(50),
        @PREFIXO BIGINT,
        @STATUS TINYINT
    AS
    BEGIN
        DECLARE @concat INT = 0
        DECLARE @strConcat NVARCHAR(7)
        DECLARE @cmdSQL NVARCHAR(2000)
        IF(@PREFIXO <> 0) BEGIN
            set @cmdSQL = 'SELECT C.Prefixo,
                                V.ValidadorID,
                                V.Mascara,
                                V.Rc, V.Wlan,
                                tv.DESCRICAO
                                FROM tblValidadoresPiedade V
                                INNER JOIN tblCarrosPiedade C
                                ON C.ValidadorID = V.ValidadorID
                                INNER JOIN tblStatusValidador tv
                                ON tv.statusID = V.StatusID
                                WHERE C.PREFIXO LIKE '''+ CONVERT(nvarchar, @PREFIXO, 111)+'%' + ''''
        END
        ELSE BEGIN
            SET @cmdSQL = 'SELECT C.Prefixo,
                                    V.ValidadorID,
                                    V.Mascara,
                                    V.Rc, V.Wlan,
                                    tv.DESCRICAO
                                    FROM tblValidadoresPiedade V
                                    INNER JOIN tblCarrosPiedade C
                                    ON C.ValidadorID = V.ValidadorID
                                    INNER JOIN tblStatusValidador tv
                                    ON tv.statusID = V.StatusID '       
           
            IF(@Mascara <> 0) BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' OR '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'v.mascara LIKE '+ '''' +  CONVERT(NVARCHAR, @Mascara,111)+'%' + ''''
            END
            IF(@WLAN <> '') BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' AND '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'v.WLAN LIKE '+ '''' + CONVERT(NVARCHAR, @WLAN,111)+ '%' + ''''
            END
            IF(@RC <> '') BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' OR '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'v.Rc LIKE '+ '''' + CONVERT(VARCHAR, @RC,111)+'%' + ''''
            END
           
            IF(@STATUS <> 0) BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' OR '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'tv.StatusID LIKE ' + '''' + CONVERT(VARCHAR, @STATUS,111)+'%' + ''''
            END
        END
        execute sp_executesql @cmdSQL
    END

     

     

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    terça-feira, 23 de novembro de 2010 13:00

Todas as Respostas

  • Edney,

    Qdo tenho query's mais elaboradas q não funcionam, normalmente "quebro" ela em partes. Tente fazer isso para usar onde tenha somente um LIKE. Assim vc saberá em que ponto está o erro. As vezes é um dos comandos LIKE que está com problemas e não todos.

    Outra forma que faço é "printar" o comando que vc está montando. Pode ser que devido a um problema com aspas, parenteses, etc, sua query não roda.

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    terça-feira, 23 de novembro de 2010 12:02
  • Ola marco esta o problema é o seguinte esta query funfa perfeitamente usando = <> etc

    soah q ela não fumega com like justamente por causa das aspas e eu não estou conseguindo

    concatenar a string para mandar ela para o sp_executesql


    Att Edney Desenvolvedor C#, WindowsForms, Asp.Net WebForms, Asp.Net MVC
    terça-feira, 23 de novembro de 2010 12:44
  • Edney,

    Tente essa:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE FiltrarValidadorBusca
        @Mascara BIGINT,
        @WLAN VARCHAR(50),
        @RC VARCHAR(50),
        @PREFIXO BIGINT,
        @STATUS TINYINT
    AS
    BEGIN
        DECLARE @concat INT = 0
        DECLARE @strConcat NVARCHAR(7)
        DECLARE @cmdSQL NVARCHAR(2000)
        IF(@PREFIXO <> 0) BEGIN
            set @cmdSQL = 'SELECT C.Prefixo,
                                V.ValidadorID,
                                V.Mascara,
                                V.Rc, V.Wlan,
                                tv.DESCRICAO
                                FROM tblValidadoresPiedade V
                                INNER JOIN tblCarrosPiedade C
                                ON C.ValidadorID = V.ValidadorID
                                INNER JOIN tblStatusValidador tv
                                ON tv.statusID = V.StatusID
                                WHERE C.PREFIXO LIKE '''+ CONVERT(nvarchar, @PREFIXO, 111)+'%' + ''''
        END
        ELSE BEGIN
            SET @cmdSQL = 'SELECT C.Prefixo,
                                    V.ValidadorID,
                                    V.Mascara,
                                    V.Rc, V.Wlan,
                                    tv.DESCRICAO
                                    FROM tblValidadoresPiedade V
                                    INNER JOIN tblCarrosPiedade C
                                    ON C.ValidadorID = V.ValidadorID
                                    INNER JOIN tblStatusValidador tv
                                    ON tv.statusID = V.StatusID '       
           
            IF(@Mascara <> 0) BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' OR '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'v.mascara LIKE '+ '''' +  CONVERT(NVARCHAR, @Mascara,111)+'%' + ''''
            END
            IF(@WLAN <> '') BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' AND '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'v.WLAN LIKE '+ '''' + CONVERT(NVARCHAR, @WLAN,111)+ '%' + ''''
            END
            IF(@RC <> '') BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' OR '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'v.Rc LIKE '+ '''' + CONVERT(VARCHAR, @RC,111)+'%' + ''''
            END
           
            IF(@STATUS <> 0) BEGIN
                IF(@concat = 0)BEGIN
                    SET @strConcat = ' WHERE '
                    SET @concat = 1
                END
                ELSE BEGIN
                    SET @strConcat = ' OR '
                    SET @concat = 1
                END
                SET @cmdSQL += @strConcat + 'tv.StatusID LIKE ' + '''' + CONVERT(VARCHAR, @STATUS,111)+'%' + ''''
            END
        END
        execute sp_executesql @cmdSQL
    END

     

     

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    terça-feira, 23 de novembro de 2010 13:00
  • Era exatamente o q eu qria apartir deste modelo vou estudar esta cadeia de caracteres para não sofrer
    tanto mas sou mto grato a ti Sr Marcos isto me ajudo mto msmo qlqr coisa eu posto novamente

    ^^


    Att Edney Desenvolvedor C#, WindowsForms, Asp.Net WebForms, Asp.Net MVC
    terça-feira, 23 de novembro de 2010 13:26