terça-feira, 9 de março de 2010

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Durante o deploy de uma tabela com informações de trace, encontrei a seguinte mensagem:

 

Msg 306, Level 16, State 2, Line 1

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

 

Erros com severity level 16, são gerados pelo usuário e podem ser corrigidos pelo usuário. Campos BLOB não podem ser usados na cláusula GROUP BY.

Alterei a query e onde antes estava:

select

      TextData

from

      Altitude.Trace_Performance_02032010

where

      duration > 10000

group by

      TextData

 

Mudei para:

select

      Cast(TextData as Varchar(8000)) as TextData

from

      Altitude.Trace_Performance_02032010

where

      duration > 10000

group by

      Cast(TextData as Varchar(8000))

Até a próxima!

 

 

segunda-feira, 8 de março de 2010

Procedures não documentadas: sp_MSforeachtable e sp_MSforeachdb

Existem algumas procedures que são disponibilizadas no Sql Server, porém não apresentam nenhuma dcoumentação no Books On-Line. Isto ocorre pois algumas procedures, desempenham papéis não esenciais mas mesmo assim apresentam bastante utilidade.

É o caso das procedures sp_MSforeachtable e sp_MSforeachdb, que respectivamente executam um ou mais comandos sql, para cada objeto relacionado a sua execução. Por exemplo, sp_MSforeachtable executa um comando para cada tabela do banco de dados onde está sendo executado e sp_MSforeachdb executará um comando sql para cada banco de dados da instância onde está instalado.

Como já é de praxe aqui no TSQLMASTER.NET, vamos entender estas procedures, fazendo alguma coisa produtiva com ela. Que tal, listarmos o nome de cada tabela do banco de dados, e suas respectivas colunas? Veja o script abaixo:

--criando uma temp para armazenar os registros
create table #lista_colunas(tablename varchar(128),
    columnname varchar(150))

--executando o comando
exec sp_MSforeachtable
   'INSERT INTO #lista_colunas SELECT ''?'', NAME FROM SYS.COLUMNS WHERE OBJECT_ID=OBJECT_ID(''?'') order by 1'

--selecionando os dados
select * from #lista_colunas
    order by tablename

--elimando a tabela
drop table #lista_colunas
Interessante, mas talvez não tão útil? Vamos ver então uma tarefa bastante comum para administradores de banco de dados. Que tal executar um REBUILD em todos os índices de cada tabela do seu banco de dados, mudando o FillFactor para 80?

sp_msforeachtable 'ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 80)'

E sem esquecer da sp_MSforeachdb, vanos ver uma implementação interessante e realmente exemplar do seu uso. Que tal fazermos um backup rápido e seguro de cada um dos bancos da sua instância?

declare @cmd1 varchar(500)
declare @cmd2 varchar(500)
declare @cmd3 varchar(500)

set @cmd1 =
   'if ''?'' <> ''tempdb'' print ''*** Processando DB ? ***'''
set @cmd2 = 'if ''?'' <> ''tempdb'' backup database ? to disk=''c:\temp\?.bak'''
set @cmd3 = ''
exec sp_MSforeachdb @command1=@cmd1,
                    @command2=@cmd2,
                    @command3=@cmd3

Até a próxima!

Mudando o owner de uma tabela no SQL SERVER

Para alterar o owner de uma tabela, podemos usar a procedure sp_changeobjectowner, passando dois parâmetros:

  •  Nome da tabela
  •  Novo Owner

Por exemplo, se quisermos mudar o owner da tabela, clientes para o owner “analista”, podemos executar o seguinte script:

sp_changeobjectowner 'dbo.clientes' , 'altitude'

Até a próxima!

sexta-feira, 5 de março de 2010

Localizar Job e Step que referenciam uma determinada Procedure

Podemos visualizar qual Job e Step fazem referência a uma determinada procedure ou query, através do script abaixo. Onde está escrito “nome da procedure”, substitua pelo nome da procedure ou objeto que você deseja localizar.

 

select * from msdb..sysjobs

where job_id in (select job_id from msdb..sysjobsteps

                         where command like '%nome da procedure%')

 

Até a próxima!