none
Converter Procedure Firebird para Function SQL Server RRS feed

  • Pergunta

  • Olá.

    Estou passando por grandes problemas com o SQL Server 2014 e o T-SQL.

    Acontece que tenho a seguinte procedure no firebird. 

    create or alter procedure PRC_PRODUTOS_VENDEDOR
    returns (
        ICODVEN integer,
        ICODITE integer)
    as
    declare variable IDMIX integer;
    declare variable IDVENDEDOR integer;
    declare variable TIPO varchar(1);
    declare variable CODIGO varchar(15);
    declare variable IDITEM integer;
    declare variable SSQL varchar(500);
    BEGIN
        FOR SELECT MIXV0.IDMIX, MIXV0.IDVENDEDOR,
                CFG0.TIPO, CFG0.CODIGO
            FROM TBLMIXVEN0 MIXV0
            LEFT JOIN TBLCDSCFGMIX0 CFG0 ON(CFG0.IDMIX = MIXV0.IDMIX)
            ORDER BY MIXV0.IDVENDEDOR
            INTO :IDMIX, :IDVENDEDOR, :TIPO, :CODIGO
        DO BEGIN
            ICODVEN = :IDVENDEDOR;
            SSQL = 'SELECT ITE0.IDITEM FROM TBLCDSITE0 ITE0 WHERE ';
            if (:tipo = 'S') then begin
                  IF (char_LENGTH(:CODIGO) >= 4) THEN BEGIN
                     SSQL = SSQL || ' ITE0.IDSECAO    = ' || SUBSTRING(:CODIGO from 1 for 4);
                  END
                  IF (char_LENGTH(:CODIGO) >= 9) THEN BEGIN
                     SSQL = SSQL || ' AND  ITE0.IDGRUPO    = ' || SUBSTRING(:CODIGO from 6 for 4);
                  END
                  IF (char_LENGTH(:CODIGO) >= 14) THEN BEGIN
                     SSQL = SSQL || ' AND  ITE0.IDSUBGRUPO = ' || SUBSTRING(:CODIGO from 11 for 4);
                  END
             end
             if (:tipo = 'I') then begin
                SSQL = SSQL || ' ITE0.IDITEM = ' || :CODIGO;
             END
    
            FOR EXECUTE STATEMENT :ssql into :IDITEM
            DO BEGIN
                icodite = :IDITEM;
                suspend;
            END
        END
    END

    E preciso converte-la para SQL server. Acontece que estou tentando de diversas formas e, com nem uma forma obtive sucesso.

    Segue o que fiz até então.

    CREATE FUNCTION PRC_PRODUTOS_VENDEDOR()
    RETURNS @tbl TABLE (
    	ICODVEN INT,
    	ICODITE INT
    )
    AS BEGIN
    	DECLARE @IDMIX as INT;
        DECLARE @IDVENDEDOR as INT;
        DECLARE @TIPO as  VARCHAR(1);
        DECLARE @CODIGO as  VARCHAR(15);
        DECLARE @IDITEM as INT;
        DECLARE @SSQL NVARCHAR(500);
    
    	
        DECLARE ITENS CURSOR FOR SELECT MIXV0.IDMIX, MIXV0.IDVENDEDOR,
                CFG0.TIPO, CFG0.CODIGO
            FROM TBLMIXVEN0 MIXV0
            LEFT JOIN TBLCDSCFGMIX0 CFG0 ON(CFG0.IDMIX = MIXV0.IDMIX);
    
    	OPEN ITENS; 
    
    	set @SSQL = '';
        FETCH NEXT FROM ITENS INTO @IDMIX, @IDVENDEDOR, @TIPO, @CODIGO ;
    	WHILE (@@FETCH_STATUS=0)
    	BEGIN        
            set @SSQL = @SSQL + ' SELECT ('+ convert(varchar(15), @IDVENDEDOR) +') AS IDVENDEDOR, ITE0.CODIGO FROM TBLCDSITE0 WHERE ';
            if (@tipo = 'S') 
                  IF (LEN(@CODIGO) >= 4) 
                     SET @SSQL = @SSQL + ' IDSECAO    = ' + SUBSTRING(@CODIGO, 1 , 4);           
                  IF (LEN(@CODIGO) >= 9) 
                     SET @SSQL = @SSQL + ' AND IDGRUPO    = ' + SUBSTRING(@CODIGO, 6 , 4);           
                  IF (LEN(@CODIGO) >= 14) 
                     SET @SSQL = @SSQL + ' AND IDSUBGRUPO = ' + SUBSTRING(@CODIGO, 11 , 4);                       
             if (@tipo = 'I') 
                SET @SSQL = @SSQL + ' CODIGO = ' + @CODIGO ; 
    				 
    	     INSERT INTO @tbl exec sp_executesql @SSQL;	     	 
    	end      
    	RETURN			
    END
    
    

    Já tentei de tantas formas diferentes que estou achando que o SQL Server simplesmente não executa comandos SQL dinamicos... Em fim.

    Espero que possam me ajudar.

    Att.

    Artur Barth

    10/08/2015

    segunda-feira, 10 de agosto de 2015 19:06

Respostas

  • Boa tarde,

    Não sei se entendi corretamente o seu código, mas experimente fazer um teste com a query abaixo:

    SELECT MIXV0.IDVENDEDOR, CA.IDITEM
    FROM TBLMIXVEN0 MIXV0
    LEFT JOIN TBLCDSCFGMIX0 CFG0 
        ON CFG0.IDMIX = MIXV0.IDMIX
    cross apply
    (
        SELECT ITE0.IDITEM FROM TBLCDSITE0 ITE0 
        WHERE 
            (CFG0.TIPO = 'I' AND 
             ITE0.IDITEM = CFG0.CODIGO) OR
            (CFG0.TIPO = 'S' AND
             (LEN(CFG0.CODIGO) < 4 OR ITE0.IDSECAO = SUBSTRING(CFG0.CODIGO, 1, 4)) AND
             (LEN(CFG0.CODIGO) < 9 OR ITE0.IDGRUPO = SUBSTRING(CFG0.CODIGO, 6, 4)) AND
             (LEN(CFG0.CODIGO) < 14 OR ITE0.IDSECAO = SUBSTRING(CFG0.CODIGO, 11, 4)))
    ) as ca
    ORDER BY MIXV0.IDVENDEDOR

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Artur Barth terça-feira, 11 de agosto de 2015 11:14
    segunda-feira, 10 de agosto de 2015 21:17

Todas as Respostas

  • Boa tarde,

    Não sei se entendi corretamente o seu código, mas experimente fazer um teste com a query abaixo:

    SELECT MIXV0.IDVENDEDOR, CA.IDITEM
    FROM TBLMIXVEN0 MIXV0
    LEFT JOIN TBLCDSCFGMIX0 CFG0 
        ON CFG0.IDMIX = MIXV0.IDMIX
    cross apply
    (
        SELECT ITE0.IDITEM FROM TBLCDSITE0 ITE0 
        WHERE 
            (CFG0.TIPO = 'I' AND 
             ITE0.IDITEM = CFG0.CODIGO) OR
            (CFG0.TIPO = 'S' AND
             (LEN(CFG0.CODIGO) < 4 OR ITE0.IDSECAO = SUBSTRING(CFG0.CODIGO, 1, 4)) AND
             (LEN(CFG0.CODIGO) < 9 OR ITE0.IDGRUPO = SUBSTRING(CFG0.CODIGO, 6, 4)) AND
             (LEN(CFG0.CODIGO) < 14 OR ITE0.IDSECAO = SUBSTRING(CFG0.CODIGO, 11, 4)))
    ) as ca
    ORDER BY MIXV0.IDVENDEDOR

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Artur Barth terça-feira, 11 de agosto de 2015 11:14
    segunda-feira, 10 de agosto de 2015 21:17
  • Gapimex boa noite,

    Me desculpe postar neste theard, porem nao tenho seu contato, eu gostaria de saber se voce pode me ajudar na minha duvida postada aqui no forum:

    https://social.technet.microsoft.com/Forums/pt-BR/94d66bd5-4632-4f54-8e20-04e145c6ef1f/dias-uteis-funo?forum=520

    Voce ja me ajudou outras vezes, e mais uma vez estou precisando, porem sem solução ate o momento

    Obrigado

    terça-feira, 11 de agosto de 2015 00:08
  • Opa.

    Bom dia.

    Funcionou certinho da forma que preciso com o comando que postou ali.

    Muiiiito obrigado mesmo. Sou novato em SQL Server e ainda não conheço esses comandos SQL diferenciados, conheço só o básico em função de que utilizávamos Firebird na empresa e agora estamos no processo de migração para um banco mais robusto.

    Obrigado mais uma vez. 

    Att.

    Artur Barth 

    terça-feira, 11 de agosto de 2015 11:14