22 abril 2012

FOR SELECT no SQL Server

Pessoal,

Muita gente (assim como eu) usa um recurso muito útil do Fibrebird que é o FOR SELECT, onde criamos uma loop e a cada passada ele carrega as variáveis com o registro atual e dentro podemos colocar outras instruções usando essas variáveis.

Ao migrar para o SQL Server possivelmente você terá esse problema de "adaptação" se não tiver experiência na sintaxe do banco. Nesse caso temos que mudar algumas linhas no código para que o mesmo recurso funcione. Daí teremos que trabalhar com CURSORES... Veja como abaixo:


Utilizo um exemplo onde tenho uma tabela de perfil de acesso e configuração do perfil, onde tenho outra tabela com minhas configurações base para os perfis, assim que inseridos (Quando tiver tempo posto tudo aqui em um tutorial). Ao inserir o perfil base, eu tenho que lançar esse registro em todos os perfis de acesso já cadastrados (numa trigger), daí faço o seguinte (usando o FOR SELECT no Firebird)


NO FIREBIRD:



CREATE OR ALTER TRIGGER PERFILACESSO_BASE_AI0 FOR PERFILACESSO_BASE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable vCodPerfilAcesso codigo_small;
declare variable vCodColaborador  codigo;


begin
  /* Insere na tabela de configuracao de acesso e perfis personalizados as novas configuracoes */
  for select idPERFILACESSO
      from perfilacesso
      into :vcodperfilacesso do
  begin
    insert into perfilacesso_config
    values (null, :vcodperfilacesso, new.tag_form,new.grupo,new.descricaofuncao, new.acessar, new.incluir,
            new.editar,new.deletar,new.localizar,new.imprimir,new.acessar_visivel,
            new.incluir_visivel,new.editar_visivel,new.deletar_visivel,new.localizar_visivel,new.imprimir_visivel);
  end
end



NO SQL SERVER


Esse exemplo agora no SQL Server, preciso "traduzí-lo" para que a coisa funcione, buscando o registro na tabela temporária INSERTED para fazer os inserts

CREATE TRIGGER trInsereConfigNovoPerfil

   ON  PERFILACESSO_BASE
   AFTER INSERT
AS 
BEGIN
SET NOCOUNT ON;

DECLARE @IDPERFIL SMALLINT;


--INSTANCIA O CURSOR COM O CONTEUDO DA TABELA (=FOR SELECT FB)
DECLARE CADPERFIL CURSOR FOR SELECT IDPERFILACESSO  FROM PERFILACESSO (NOLOCK);
 
--ABRE O CURSOR CHAMADO CADPERFIL (Instancia do Cadastro de Perfis de Acesso)
OPEN CADPERFIL; 

--PEGA O VALOR DO PRIMEIRO REGISTRO E ATRIBUI À VARIAVEL
FETCH CADPERFIL INTO @IDPERFIL;

--FAZ LOOP NO CURSOR PARA GRAVAR AS CONFIGURAÇÕES DE ACESSO EM CADA PERFIL
WHILE (@@FETCH_STATUS=0)
BEGIN
   INSERT INTO PERFILACESSO_CONFIG
   SELECT NULL,@IDPERFIL,I.TAG_FORM,I.GRUPO,I.DESCRICAOFUNCAO, I.ACESSAR, I.INCLUIR,
I.EDITAR,I.DELETAR,I.LOCALIZAR,I.IMPRIMIR,I.ACESSAR_VISIVEL,
I.INCLUIR_VISIVEL,I.EDITAR_VISIVEL,I.DELETAR_VISIVEL,I.LOCALIZAR_VISIVEL,I.IMPRIMIR_VISIVEL
   FROM INSERTED I
   
   --PEGA PROXIMO REGISTRO
FETCH NEXT FROM CADPERFIL INTO @IDPERFIL;

END


--FECHA O CURSOR
CLOSE CADPERFIL;
DEALLOCATE CADPERFIL; --DESTROI A INSTÂNCIA

END
GO


Abraços e até a próxima!

Nenhum comentário:

Postar um comentário