Usuário com melhor resposta
Converter Procedure Firebird para Function SQL Server

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
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
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
-
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
-
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