Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Joga.la
» Início » Desenvolvimento » Banco de dados e SQL » SQL Server 2005 T-SQL Tips: Concatenando e Agrupando -->
 
Avaliação: | Publicado em: 05/02/2008
SQL Server 2005 T-SQL Tips: Concatenando e Agrupando


Concatenação com Cursores

Os cursores podem ser utilizados para realizar a concatenação dos telefones. Como os cursores permitem a execução lógicas procedurais (em contraposição à lógica declarativa da SQL), é possível realizar operações linha a linha com mais facilidade. Nesse caso, toda vez que uma linha com um novo cliente for lida, acumula-se cada telefone em uma variável delimitando-o. Quando a relação de telefones daquele cliente for concluída, repete-se o processo para o próximo cliente até que todos os clientes e seus telefones tenham sido lidos.

Use Testes

-- Declaração de Variáveis Auxiliares
DECLARE @Telefones TABLE (
 CliCodigo INT,
 Contato VARCHAR(70))

DECLARE 
 @CliCodigo INT, @CliCodigoAnt INT,
 @ContatoAnt VARCHAR(70), @Contato VARCHAR(70)

SET @ContatoAnt = ''

DECLARE Telefones CURSOR
LOCAL
FAST_FORWARD
FOR SELECT

 CliCodigo,
 TelTipo + ':' + CAST(TelDDD AS CHAR(2)) + '-' +
 LEFT(TelNumero,4) + '-' + RIGHT(TelNumero,4)
FROM
 tblTelefones
ORDER BY
 CliCodigo

OPEN Telefones

FETCH NEXT FROM Telefones INTO @CliCodigo, @Contato
SET @CliCodigoAnt = @CliCodigo

WHILE (@@FETCH_STATUS = 0)
BEGIN

 IF (@CliCodigoAnt != @CliCodigo)
 BEGIN

  INSERT INTO @Telefones VALUES (@CliCodigoAnt, @ContatoAnt)
  SET @CliCodigoAnt = @CliCodigo
  SET @ContatoAnt = ''
 END
 ELSE
 BEGIN
  SET
@ContatoAnt = @ContatoAnt + @Contato + ' ; '
  FETCH NEXT FROM Telefones INTO @CliCodigo, @Contato
 END  
END

INSERT INTO @Telefones VALUES (@CliCodigoAnt, @ContatoAnt)

CLOSE Telefones
DEALLOCATE Telefones

SELECT
 CliNome As Cliente, LEFT(Contato,LEN(Contato) - 2) As Contatos
FROM
 @Telefones As Tel
 INNER JOIN tblClientes As Cli ON Tel.CliCodigo = Cli.CliCodigo

Para que os resultados possam ser lidos em uma instrução SELECT, é preciso armazenar os resultados em uma tabela. Para esse armazenamento, utilizou-se das variáveis do tipo TABLE. É possível utilizar mais de um cursor para realizar essa formatação, mas cursores costumam ser onerosos e nesse caso optei por utilizar um único cursor (ainda que um pouco mais complexo).

A solução de cursores é mais flexível que a solução das subqueries, uma vez que irá retornar apenas os telefones realmente existentes. Essa solução considera apenas os telefones que existem e não os que poderão existir. Com as devidas adaptações ela também supera outras limitações da utilização de subqueries como mais de uma ocorrência com um mesmo tipo. Ainda assim, visto que um cursor foi utilizado, é possível que o desempenho das subqueries seja superior se a quantidade de registros existentes for próxima da quantidade de registros possíveis e se o número de registros for muito grande. Cursores permitem operações linha a linha, mas trazem um overhead adicional ao banco de dados.

Páginas: « Anterior 1 2 3 4 5 6 7 8 Próximo »  Próximo: SQLCLR »


Eh massa mais naum consigo instala tem como ajudar ::?? Pelo Amor de Deus MAIS SERIO Mermu ajuda aeee Se Pode=D

Fica Com Deus