Currently Browsing

Posts Tagged ‘ sql server 2008 ’

T-SQL: CSV para Linhas (UDF e XML)

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

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

sqlserver2k8deepdive

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

Programa do Evento

SQL Server 2008 Resource Governor

sql_server_2008_logo

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:

Resource Governor Concepts

Managing SQL Server Workloads with Resource Governor

Using Resource Governor (download white-paper)

Alterar a estrutura de um UserDefinedTable Type no SQL Server 2008

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:

  1. Criar uma novo tipo igual ao que pretendo remover com um novo nome
  2. Alterar para o novo nome todas as referências do que pretendemos alterar
  3. Remover o tipo que existia inicialmente
  4. Criar o novo com as alterações pretendidas e voltar a substituir todas as referências
  5. 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

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.

sql_server_2k8_select_edit_rows_limits

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.

image

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

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:

  1. Menu Edit > Intellisence > Refresh Local Cache
  2. Pelo atalho CTRL + SHIFT + R

SQL Server 2008 SP1 disponivel

Está disponível para download o SP1 para o SQL Server 2008.

Download

SQL Server 2008 – erro ao alterar a estrutura de uma tabela

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.

sql2k8_savedialogwarnig

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.

sql2k8_optionsdialog

Blogroll