Currently Browsing

Posts Tagged ‘ sql ’

Application Name na ConnectionString

Quando estou a desenolver algum projecto, é normal necessitar de analisar as querys que são executadas na base de dados para detectar um possivel bug ou algo que não esteja a bater certo com o que esperava.

Para isso, uso o Profiler do SQL Server que me dá rapidamente uma boa visão do que está a ser solicitado em cada ligação à base de dados.

O exemplo de um registo no profiler pode ser visto assim:

Como se pode ver, a coluna Application Name tem o valor “.Net SqlClient Data Provider”, o que nos dificulta bastante a filtragem para apenas a aplicação que pretendemos analisar os dados.

Para resolver isso, basta-nos indicar na ConnectionString, o nome da nossa aplicação, e tudo fica mais fácil.

"Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True;Application Name=MyAppName"

Após isto,, já teremos algo mais amigável como:

Sql Saturday Portugal

Dia 15 de Abril, realizou-se o primeiro Sql Saturday em Portugal, que contou com a organização da comunidade SQLPort.

Foi um dia bem passado, recheado de boas sessões, e não podia acabar da melhor forma, ao ganhar uma licença do SQL Prompt da Redgate.

Para finalizar este post, resta dar os parabens à comunidade SQLPort pelo bom trabalho em todo o evento.

The Red Gate Guide to SQL Server Team-based Development

This book shows how to use a mixture of home-grown scripts, native SQL Server tools, and tools from the Red Gate SQL Toolbelt, to successfully develop database applications in a team environment, and make database development as similar as possible to "normal" development.

Download

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)

LinkedServer do SQL Server 32 bits no SQL Server 64 bits

Esta semana andei mudar algumas base de dados que estavam no SQL Server 2005 e 2000 para o 2008.

Tudo a correr bem, até uma das base de dados incluir Stored Procedures que utilizavam um LinkedServer para o SQL Server 2000.

Testei uma simples query a uma das tabelas utilizando esse linkedserver e fui confrontado com o seguinte erro:

OLE DB provider "SQLNCLI10" for linked server "MYSERVER" returned message "Erro não especificado".
OLE DB provider "SQLNCLI10" for linked server "MYSERVER" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.".
Msg 7311, Level 16, State 2, Line 1
Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI10" for linked server "MYSERVER". The provider supports the interface, but returns a failure code when it is used.

Andei um bom tempo de volta da criação do Linked Server sem qualquer sucesso, mas umas pesquisas no Google e fui encontrar a solução.

USE [master]
CREATE PROCEDURE [sp_tables_info_rowset_64]
@table_name sysname
, @table_schema sysname = NULL
, @table_type nvarchar(255) = null
AS
DECLARE @Result int
SELECT @Result = 0

EXEC @Result = sp_tables_info_rowset @table_name, @table_schema, @table_type
GO

Este erro acontece quando estamos a linkar num SQL Server de 64 bits para o Sql Server 32 bits.

Para resolver é necessário então criar este SP na tabela master do SQL Server 32 bits.

T-SQL Intellisense no SQL Server 2008 Management Studio

Parece que vamos ter (finalmente) o intellisense no SQL Server 2008 Management Studio. :)

Blogroll