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
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!
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!
Cara, muito obrigado. Estou lendo em 2016 e foi muito útil para mim.
ResponderExcluir