set 10

Para selecionar apenas a segunda linha de uma consulta no SQL Server basta utilizar alguns artifícios como limitar a quantidade de registros retornados excluindo também os registros indesejados. Para isto utilizaremos o TOP e o NOT IN. Já expliquei aqui um pouco sobre estes comandos, inclusive em outras linguagens.

Veja um exemplo.

SELECT TOP 1 nome_dos_campos FROM nome_tabela
WHERE     (campo_chave NOT IN
     (SELECT TOP 1 campo_chave FROM nome_tabela)
)

Do mesmo modo, para selecionar a terceira, quarta ou qualquer linha basta alterar o valor do TOP da sub-select.
Por exemplo, para pegar a 15ª linha faça:

SELECT TOP 1 nome_dos_campos FROM nome_tabela
WHERE     (campo_chave NOT IN
     (SELECT TOP 14 campo_chave FROM nome_tabela)
)

View this Post in: English French Italian Spanish

set 02

Para resetar um campo auto incremento do SQL Server basta utilizar o comando abaixo:

DBCC CHECKIDENT('tabela', RESEED, 0) ;

Onde ‘tabela’ é o nome da tabela, e 0 é o valor inicial -1. Ou seja, para que o próximo registro tenha o código 5 você precisa setar o valor para 4. Para que ele comece do 1 você seta para 0 como no exemplo.

Veja também como resetar campos auto-incremento do Access  aqui.


View this Post in: English French Italian Spanish

ago 26

Para exemplificar o uso do CASE em uma consulta SQL, estarei mostrando aqui alguns exemplos quem podem ser aplicados à situação a seguir.

Suponha que você tenha uma tabela de pessoas com os campos, cdcliente, cdfornecedor e tppessoa. Onde nesta tabela ou o campo cdcliente estará preenchido ou o campo cdfornecedor.

A idéia será fazer um sql que retorne o nome da pessoa dependendo do tipo.

Uma das soluções seria fazer dois left joins nas tabelas de cliente e fornecedor pegando o nome de cada uma delas. No entanto, neste caso a consulta retornaria dois campos, e isto não é desejado.

Para fazer então que a consulta retorne apenas um campo, utilizaremo o CASE.

Veja:

SELECT nome =
CASE tppessoa
   WHEN 1 THEN (
      SELECT c.nome FROM cliente c WHERE c.cdcliente = p.cdcliente
   )
   WHEN 2 THEN (
      SELECT f.nome FROM fornecedor f
      WHERE f.cdfornecedor = p.cdfornecedor
   )
   ELSE ''
END
FROM pessoa p

Neste exemplo, estamos verificando qual o valor contido no campo tppessoa. Caso for 1, fazemos um select na tabela de cliente buscando o seu nome. E caso for 2 buscamos o nome na tabela de fornecedores. O resultado e armazenado no campo nome, criado na própria consulta. Se nenhuma dos valores (1 ou 2) for verdadeiro o campo irá receber uma string vazia (neste caso).

Outra solução seria:

SELECT nome =
CASE
   WHEN cdfornecedor is not null THEN (
      SELECT c.nome FROM cliente c WHERE c.cdcliente = p.cdcliente
   )
   WHEN cdfornecedor is not null THEN (
      SELECT c.nome FROM cliente c WHERE c.cdcliente = p.cdcliente
   )
END
FROM pessoa p

Neste caso o campo tppessoa nem é necessário contanto que exista na tabela somente o valor de cdcliente ou cdfornecedor, sendo que um dos campos deverá conter valor nulo. Perceba que agora o CASE possui condições distintas, diferente do primeiro exemplo. Utilizando essa mesma idéia poderíamos fazer um select que retornaria a descrição do tipo de pessoa, por exemplo:

SELECT nmtppessoa =
   CASE
      WHEN cddependente is not null THEN 'Cliente'
      WHEN numatricula is not null THEN 'Fornecedor'
   END
FROM pessoa p

O CASE também pode ser usado em uma condição, ou seja dentro do WHERE. Veja um outro exemplo:

SELECT NOME , SALDO , SALDO_POUPANÇA , SALDO_APP , VAL_DEPOSITO
FROM CONTA_CORRENTE
WHERE
   (
   CASE SALDO
      WHEN SALDO < 0 THEN SALDO_POUPANÇA
      WHEN SALDO >= 0 THEN SALDO
      WHEN SALDO > 10000 THEN SALDO_APP
   ) > VAL_DEPOSITO

Neste exemplo, a condição sendo verdadeira, o que será retornado será o valor de um dos campos que logo após será verificado se é maior do que VAL_DEPOSITO, finalizando assim o WHERE da consulta principal.


View this Post in: English French Italian Spanish

ago 24

Muitas das vezes precisamos recuperar apenas algumas das diversas linhas retornadas por uma consulta SQL. Por isso, para economizar alguns bytes trafegando pela rede, nada mais fácil do que fazer a consulta só retornar a quantidade de linhas desejadas. Para fazer isso, segue abaixo o comando referente a diversos banco de dados.

SQL SERVER

SELECT TOP n nome_campos FROM nome_tabela

Onde n é o número de linhas desejadas, nome_campos são os campos ou o campo que será retornado e nome_tabela o nome da tabela.

Utilizando este recurso conseguimos também fazer paginação de dados. Por exemplo:

SELECT     TOP 5 nome_campos FROM nome_tabela

WHERE     (campo_chave NOT IN

                   (SELECT TOP 10 campo_chave FROM nome_tabela)

)

Onde 5 é o número de registro por página e 10 é o resultado da multiplicação da quantidade de registros pela página atual. No exemplo, o SQL retornaria os registros da segunda página. Para retornar da terceira bastaria mudar o SQL substituindo o 10 por 15 e assim por diante.

MYSQL

SELECT * FROM TABELA LIMIT n

ou

SELECT * FROM TABELA LIMIT 0, n

No MySQL é ainda mais fácil fazer paginação de dados. Veja.

Ex.:

SELECT * FROM TABELA LIMIT 10, 5

Da mesma maneira que no exemplo do SQL Server, o resultado se aplica a uma paginação de 5 registros por página.
A paginação ocorre então ao mudar o valor 10 para 15, 20, 25 etc… Ou seja multiplicar a núrero da página pela quantidade de registro por página.

FIREBIRD

SELECT FIRST n nome_campos FROM nome_tabela;

Para fazer a paginação e pular os registros utiliza-se a cláusula SKIP.

SELECT FIRST n SKIP x nome_campos FROM nome_tabela;

INTERBASE

No INTERBASE não há o comando FIRST. Usa-se a cláusula ROWS  no lugar.

SELECT nome_campos FROM nome_tabela ROWS n;

Para fazer a paginação e pular os registros utiliza-se a cláusula TO.

SELECT nome_campos FROM nome_tabela ROWS 5 TO 10;

View this Post in: English French Italian Spanish

mar 17

Para comparar somente a data em um campo onde está salvo data e hora, é preciso primeiro converter a data para o formato desejado.

Ex.:

SQL Server

SELECT     campodatahora
FROM        tabela
WHERE CONVERT(nvarchar(10), campodatahora, 103) = '22/02/2006';

O 103 indica que deve ser retornado o formato dd/MM/yyyy

A tabela abaixo mostra outros códigos que podem ser utilizados com o comando CONVERT.

Supondo CURRENT_TIMESTAMP retornando o dia 22 de fevereiro de 2006 as 16 horas 26 minutos e 8 segundos.

0 Feb 22 2006 4:26PM CONVERT(CHAR(19), CURRENT_TIMESTAMP, 0)
1 02/22/06 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 1)
2 06.02.22 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 2)
3 22/02/06 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 3)
4 22.02.06 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 4)
5 22-02-06 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 5)
6 22 Feb 06 CONVERT(CHAR(9), CURRENT_TIMESTAMP, 6)
7 Feb 22, 06 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 7)
8 16:26:08 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 8 )
9 Feb 22 2006 4:26:08:020PM CONVERT(CHAR(26), CURRENT_TIMESTAMP, 9)
10 02-22-06 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 10)
11 06/02/22 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 11)
12 060222 CONVERT(CHAR(6), CURRENT_TIMESTAMP, 12)
13 22 Feb 2006 16:26:08:020 CONVERT(CHAR(24), CURRENT_TIMESTAMP, 13)
14 16:26:08:037 CONVERT(CHAR(12), CURRENT_TIMESTAMP, 14)
20 2006-02-22 16:26:08 CONVERT(CHAR(19), CURRENT_TIMESTAMP, 20)
21 2006-02-22 16:26:08.037 CONVERT(CHAR(23), CURRENT_TIMESTAMP, 21)
22 02/22/06 4:26:08 PM CONVERT(CHAR(20), CURRENT_TIMESTAMP, 22)
23 2006-02-22 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 23)
24 16:26:08 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 24)
25 2006-02-22 16:26:08.037 CONVERT(CHAR(23), CURRENT_TIMESTAMP, 25)
100 Feb 22 2006 4:26PM CONVERT(CHAR(19), CURRENT_TIMESTAMP, 100)
101 02/22/2006 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 101)
102 2006.02.22 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)
103 22/02/2006 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 103)
104 22.02.2006 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 104)
105 22-02-2006 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 105)
106 22 Feb 2006 CONVERT(CHAR(11), CURRENT_TIMESTAMP, 106)
107 Feb 22, 2006 CONVERT(CHAR(12), CURRENT_TIMESTAMP, 107)
108 16:26:08 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 108)
109 Feb 22 2006 4:26:08:067PM CONVERT(CHAR(26), CURRENT_TIMESTAMP, 109)
110 02-22-2006 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 110)
111 2006/02/22 CONVERT(CHAR(10), CURRENT_TIMESTAMP, 111)
112 20060222 CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)
113 22 Feb 2006 16:26:08:067 CONVERT(CHAR(24), CURRENT_TIMESTAMP, 113)
114 16:26:08:067 CONVERT(CHAR(12), CURRENT_TIMESTAMP, 114)
120 2006-02-22 16:26:08 CONVERT(CHAR(19), CURRENT_TIMESTAMP, 120)
121 2006-02-22 16:26:08.080 CONVERT(CHAR(23), CURRENT_TIMESTAMP, 121)
126 2006-02-22T16:26:08.080 CONVERT(CHAR(23), CURRENT_TIMESTAMP, 126)
127 2006-02-22T16:26:08.080 CONVERT(CHAR(23), CURRENT_TIMESTAMP, 127)
130 24 ???? 1427 4:26:08:080PM CONVERT(CHAR(32), CURRENT_TIMESTAMP, 130)
131 24/01/1427 4:26:08:080PM CONVERT(CHAR(25), CURRENT_TIMESTAMP, 131

View this Post in: English French Italian Spanish

fev 28

Hoje me deparei com o seguinte erro ao tentar executar uma página .net com banco de dados SQL Server.

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

Motivo do erro: As conexões com o banco de dados estavam sendo abertas mas nunca iam sendo fechadas.

Solução: http://linhadecodigo.com/Artigo.aspx?id=1254&pag=2


View this Post in: English French Italian Spanish

jan 08

Depois de criado o sistema, testado e aprovado, chega a hora de implantar o software no cliente. No entanto, depois de tantos testes, provavelmente você precisou inserir e excluir dados nas tabelas várias vezes, o que fez com que os campos do tipo auto-incremento alterassem o seu valor. Então, nada melhor do que zerar todos esses campos para que o sistema comesse do “zero”.

Para resolver esse problema você tem duas opções. Apagar todos os dados da tabela e, estando com a tabela vazia, ir no menu Ferramentas, Utilitários de Banco de Dados e clicar em Compactar e Reparar o Banco de Dados. Após isso os campos já estarão zerados.

A outra opção é, se você não quer, ou não puder apagar os dados da tabela, remover somente o campo, e insiri-lo novamente. O problema neste caso é se você já tiver criado os relacionamentos para a tabela. Pois daí você terá que remover e cria-lo novamente depois. Dará um pouco mais de trabalho mas resolverá o seu problema.


View this Post in: English French Italian Spanish