8 = 2³
Posts tagged sql server 2008
T-SQL: CSV para Linhas (UDF e XML)
Abr 10th
Esta semana precisei de fazer exactamente o que o titulo do post indica, ou seja, retornar todas as linhas de uma tabela mas ao mesmo tempo separar os valores numa das colunas em cada linha.
Para testar, criei a seguinte tabela:
CREATE TABLE [dbo].[Agentes](
[Codigo] [varchar](50) NULL,
[Nome] [varchar](50) NULL,
[Emails] [varchar](100) NULL
)
Inseri alguns dados com o mesmo formato da tabela real que iria depois utilizar:
INSERT INTO Agentes
VALUES('C12345','Agente 1','agente1@xpto.pt;agente1.loja@xpto.pt')
INSERT INTO Agentes
VALUES('C12346','Agente 2','agente2@xpto.pt;agente2.loja@xpto.pt')
Como já podem perceber, o campo “Emails” precisa de ser retornado com apenas um email, ou seja, preciso de passar uma listagem como esta

para uma como esta

Para isso precisei de fazer uma função que me separasse cada um emails de forma a poder retornar um por cada linha.
CREATE FUNCTION dbo.SplitEmails(@separador char(1), @emails varchar(512))
RETURNS table
AS
RETURN (
WITH Emails(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@separador, @emails)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@separador, @emails,
stop + 1)
FROM Emails
WHERE stop > 0
)
SELECT SUBSTRING(@emails, start, CASE WHEN stop > 0 THEN
stop-start ELSE 512 END) AS email
FROM Emails
)
Por fim, para ter a listagem com o formato pretendido, bastou fazer o CROSS APPLY com a minha tabela de agentes, e está o trabalho feito.
SELECT a.Codigo,a.Nome,c.email FROM Agentes a
CROSS APPLY SplitEmails(';',a.Emails) c

Outra forma de retornar esta listagem, indicada pelo @Caio, era recorrendo ao XML e evitava assim criar uma função para fazer o split dos emails.
WITH Consulta AS
(
SELECT Codigo, Nome,
CAST('<email>' +
REPLACE(Emails, ';', '</email><email>') +
'</email>' AS XML)
AS EmailXml
FROM Agentes
)
SELECT Codigo, Nome,
r.value('.', 'varchar(255)') AS Email
FROM
Consulta
CROSS APPLY
consulta.EmailXml.nodes('email') AS x(r)
Free SQL Server 2008 Express How-To-Guide Series
Out 1st
Estão disponiveis no msdev.com, uma série de videos sobre SQL Server 2008 Express abordando temas dos mais básicos aos mais avançados como por exemplo:
- How do I backup a remote SQL Express database?
- How do I import data from another source (Excel, Access, XML, MySQL, …) into a SQL Server Database?
- SQL Server Integration Services Overview
- etc …
Podem ver todos os videos disponiveis em http://msdev.com/Directory/SeriesDescription.aspx?CourseId=124
SQL Server 2008 Deep Dive
Ago 12th
Vai-se realizar dia 10 e 15 de Setembro, em Lisboa e no Porto respectivamente, um evento que aborda principalmente as novas funcionalidades presentes no SQL Server 2008.
Resource Governor, Partitioning, Auditing, X-Events são alguns dos temas que irão ser abordados neste evento, mas o programa completo pode ser visto aqui.
Podem fazer a inscrição nos seguintes links:
Lisboa – 10 de Setembro no Auditório Microsoft (TagusPark)
Porto – 15 de Setembro na Fundação Dr. António Cupertino de Miranda
SQL Server 2008 Resource Governor
Jul 21st
O Resource Governor é uma funcionalidade adicionado ao SQL Server 2008 que permite-nos gerir a carga e os recursos que irão ser usados em determinada base de dados.
Muitas vezes, devido a querys mal construidas ou até mesmo por se tratar de operações bastante pesadas, pretendiamos que apenas utiliza-se uma percentagem dos recursos do servidor e deixasse os restantes recursos para outras operações que fossem solicitadas.
Esta funcionalidade veio resolver isto mesmo, ou seja, podemos agora definir que determinada operação irá apenas usar X% dos recursos e até mesmo indicar quais serão as querys prioritárias.
Para perceberem melhor como funciona e como configurar, deixo os seguintes links:
Alterar a estrutura de um UserDefinedTable Type no SQL Server 2008
Jul 8th
Uma das novidades do SQL Server 2008, foi o aparecimento do UserDefinedTable Type, permitindo assim criar uma estrutura de uma tabela e usa-la como um table-value parameter.
Num projecto em que estou a trabalhar actualmente utilizo este tipo de dados e precisei de o alterar após já o ter referenciado num stored procedure. Como está bem explicito aqui, não podemos alterar a estrutura do tipo de dados após te-lo criado.
The user-defined table type definition cannot be modified after it is created.
Para o fazer, teremos que remover e criar novamente o nosso tipo com as alterações pretendidas. Extra-trabalho quando já o temos referenciado, pois como seria de esperar não deixa antes de removermos essas mesmas referências.
Para contornar o problema segui os seguintes passos:
- Criar uma novo tipo igual ao que pretendo remover com um novo nome
- Alterar para o novo nome todas as referências do que pretendemos alterar
- Remover o tipo que existia inicialmente
- Criar o novo com as alterações pretendidas e voltar a substituir todas as referências
- Remover o tipo criado no ponto 1.
Não me parece a melhor solução para este problema, mas para já é que se arranja.
Se existir uma melhor agradeço que me digam.
SSMS 2008 + Alterar nr de registos a retornar nas opções SELECT e EDIT do menu de contexto da tabela
Mai 28th
Na ultima versão do SQL Server Management Studio (SSMS), ao abrirmos o menu de contexto de uma tabela na nossa base de dados, as opções de SELECT e EDIT têm um limite de registos que irão ser retornados definido por defeito, 1000 e 200 respectivamente.
Isto faz com que sempre que quisermos retornar os resultados de uma tabela com mais de 200 (EDIT) e 1000 (SELECT), temos que ir à query gerada e retirar/alterar o “TOP N”.
Se para nós estes valores não são suficientes e queremos alterá-los, ou até mesmo ignora-los e retornarmos todos os registos da tabela, podemos fazê-lo no menu Tools > Options > SQL Server Object Explorer > Commands e alterar os valores lá definidos ou simplesmente atribuir o valor 0 (zero) fazendo com que não seja incluida a expressão TOP N.
Após esta alteração, já podem usar ambas opções com os novos valores definidos.
Actualizar a cache do Intellisence do SQL Server 2008
Mai 13th
No SQL Server 2008, quando criamos uma nova tabela, um Stored Procedure, etc … o Intellisence (no SQL Server Management Studio) não fica de imediato actualizado para acedermos rapidamente a esse objecto que criamos.
Para resolver isso, podemos actualizar a cache do Intellisence usando uma das duas formas:
- Menu Edit > Intellisence > Refresh Local Cache
- Pelo atalho CTRL + SHIFT + R
SQL Server 2008 – erro ao alterar a estrutura de uma tabela
Nov 9th
Ao tentar alterar o tipo de dados de uma coluna, surgiu-me um erro ao tentar gravar estas alterações, não me permitindo fazer o que pretendia.
Para contornar isto, temos que desactivar a opção “Prevent saving changes that require table re-creation”.
Para isso vao ao menu Tools > Options > Designers > Table and Database Designers e desmarcam essa opção.


Twitter
LinkedIn
Facebook
FriendFeed
Google Profile
Delicious


