Tag-Archive for ◊ SqlServer ◊

Imaginem que têm uma base dados ( o mais provável é não precisarem de imaginar porque têm mesmo lol )
em que várias tabelas possuem um campo chamado “data_criacao” e precisam de actualizar esse campo em todas as tabelas mas não sabem sequer que tabelas têm esse campo “data_criacao”.
Vamos por passos.
1º - Script para achar esse campo
    SELECT t.name AS table_name,
    SCHEMA_NAME(schema_idAS schema_name,
    c.name AS column_name
    FROM sys.tables AS t
    INNER JOIN sys.columns c ON t.OBJECT_ID c.OBJECT_ID
    WHERE c.name LIKE ‘%data_criacao%’
   ORDER BY schema_nametable_name;

Este script ira retornar o nome da tabela, o schema e nome da coluna (que terá de ser o nome que vocês pesquisaram :D )

2º Agora que já sabem onde estão ( mas não precisam de saber :) ) vamos a segunda parte.
O script para efectuar o update. 
Usaremos o script acima, com umas pequenas alterações, e vamos guardar o resultado numa variável e depois executamos essa variável
  begin transaction
declare @query varchar(max)
set @query=
SELECT @query=@query+‘update ‘ +t.name+’ set data_criacao=getdate() where data_criacao is null;’
–SCHEMA_NAME(schema_id) AS schema_name,
–c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE ‘%data_criacao%’
ORDER BY t.name;
exec(@query)
–commit

Não esquecer de verificar se esta tudo ok, e executar o commit que esta comentado…
Ter em atenção o tamanho máximo da varchar.. se tiverem muitas tabelas poderá não dar.. dúvido que tenham assim tantas..mas se tiverem insiram o resultado numa tabela temporária e para cada registo façam o exec :)


Qualquer dúvida, sugestão, correcção é só comentar :)
Abraços


Recentemente tive a necessidade de adicionar uma coluna a minha tabela já com registos.

Essa coluna não era uma chave mas não podia usar auto incremento e não permite nulls..

Essa coluna é um id unico entre duas tabelas que não têm relação, uma de alunos e outra de adultos na qual preciso de um unico id, logo a chave primária não server ( como são tabelas diferentes podem ser repetidos)

Exemplo:

Tabela Aluno:                  

Id_aluno Nome
1200 AAA
1201 BBB
Id_adulto Nome
5000 Adulto1
6000 Adulto2

 (são duas tabelas mas ficaram mal formatadas no blogger …..)

Agora o pretendito é ter uma coluno com um id unico entre estas duas tabelas, como já havia dados na minha tabela tinha que fazer update. Primeiro na tabela alunos depois com o MAX desse passar para a sequencia para a tablea adulto para ficar assim

Id_aluno Nome Unique_id
1200 AAA 1
1201 BBB 2
Id_adulto Nome Unique_id
5000 Adulto1 3
6000 Adulto1 4

(são duas tabelas mas ficaram mal formatadas no blogger …..)

Após correr o script que segue, é necessário criar um trigger que no insert veja qual o maior unique id entre as duas tabelas, some 1 e insirar esse valor ainda não tenho o tirgger concluido pois no meu caso é mais complexo que este aqui se precisarem deixem um post e deixo aqui o select:

select
MAX(m.unique_id)

     from
(

     select
MAX(unique_id)
as unique_id

     from aluno

     union all


select
MAX(unique_id)as unique_id

     from adulto

)
as m

Script alteração e update:

/*

#################################################                                                    #

# Script Criação campo unico entre aluno e    #

# adulto                            #

# Autor: Marcos Alves                    #

# Date: 15-09-2009                    #

# Version: 1.0                        #

#################################################

*/

begin
transaction

– adicionar coluna unique_id na tabela aluno permitindo null

ALTER
TABLE Aluno

ADD unique_id int

GO

IF
@@ERROR
<> 0


IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION

GO

IF
@@TRANCOUNT
= 1

BEGIN


PRINT
‘dbo.Aluno Table Alter Successfully’


COMMIT
TRANSACTION

END
ELSE

BEGIN


PRINT
‘Failed To Alter dbo.Aluno Table’

END

GO

– adicionar coluna unique_id na tabela adulto permitindo null

begin
transaction

ALTER
TABLE adulto

ADD unique_id int

GO

IF
@@ERROR
<> 0


IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION

GO

IF
@@TRANCOUNT
= 1

BEGIN


PRINT
‘dbo.adulto Table Alter Successfully’


COMMIT
TRANSACTION

END
ELSE

BEGIN


PRINT
‘Failed To Alter dbo.adulto Table’

END

GO

– actualizar os registos da tabela aluno

begin
transaction

DECLARE @counter int

SET @counter = 0

UPDATE Aluno SET @counter = unique_id = @counter +1 –- aqui mágiaJ

GO

IF
@@ERROR
<> 0


IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION

GO

IF
@@TRANCOUNT
= 1

BEGIN


PRINT
‘dbo.Aluno Table Update Successfully’


COMMIT
TRANSACTION

END
ELSE

BEGIN


PRINT
‘Failed To Update dbo.Aluno Table’

END

GO

– actualizar os registos da tabela adulto a partir do max

begin
transaction

DECLARE @counter int

Select @counter=MAX(unique_id)
from student

UPDATE Adulto SET @counter = unique_id = @counter +1 –- de novo magiaJ

GO

IF
@@ERROR
<> 0


IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION

GO

IF
@@TRANCOUNT
= 1

BEGIN


PRINT
‘dbo.Adulto Table Update Successfully’


COMMIT
TRANSACTION

END
ELSE

BEGIN


PRINT
‘Failed To Update dbo.Adulto Table’

END

GO

–alterar table aluno campo unique_id not null

begin
transaction

ALTER
TABLE Aluno ALTER
COLUMN unique_id int
NOT
NULL

GO

IF
@@ERROR
<> 0


IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION

GO

IF
@@TRANCOUNT
= 1

BEGIN


PRINT
‘dbo.Aluno Table Alter not null Successfully’


COMMIT
TRANSACTION

END
ELSE

BEGIN


PRINT
‘Failed To Alter not null dbo.Aluno Table’

END

GO

–alterar table adulto campo unique_id not null

begin
transaction

ALTER
TABLE Adulto ALTER
COLUMN unique_id int
NOT
NULL

GO

IF
@@ERROR
<> 0


IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION

GO

IF
@@TRANCOUNT
= 1

BEGIN


PRINT
‘dbo.Adulto Table Alter not null Successfully’


COMMIT
TRANSACTION

END
ELSE

BEGIN


PRINT
‘Failed To Alter not null dbo.Adulto Table’

END

go

E é isto J espero que tenha ajudado e qualquer dúvida é só commentar J

Abraços

Category: Uncategorized  | Tags: ,  | Leave a Comment

Erro no Setup Support Rules:
Rule Name
PerfMonCounterNotCorruptedCheck
Rule Description
Checks if existing
performance counter registry hive is consistent.
Message/Corrective Action
The performance counter registry hive is corrupted. To continue, you must
repair the performance counter registry hive. For more information, see
http://support.microsoft.com/kb/300956.
 

 

 

É provavél que já tenham tentado instalar o SQL Server 2008 Express Edition e caso não tenham o windows instalado em inglês ter surgido o erro acima descrito.
Comigo aconteceu :) andei a pesquisar e achei a solução.
Para facilitar a vida, criei uma pequena aplicação que resolve esse erro.
Segue aqui o link:

http://www.speedyshare.com/902763795.html
Entretanto a pedido fiz outra versão da aplicação:
Segue o link para download: http://www.it-improves.com/dnn/Downloads/tabid/60/Default.aspx

NOTA: a responsabilidade de algum dano causado pela aplicação é do utilizador! faça um ponto de restauro no windows antes de executar!! Garanto que é 100% sem spyware, malware,virus e essas coisas todas, apenas mexe no registo do windows o que pode causar danos no pc caso corra alguma coisa errada!

Ao efectuar o download grave no pc, se executar directamente o programa não funcionará correctamente pois fica na pasta dos temporários e não tem permissões para executar.

Para os mais desconfiados e que querem fazer de modo manual ca fica também o processo para corrigir ( são estes os passos que o programa que criei efectua)

Put this at any Console application:
string.Format(”{0,3}”,
CultureInfo.InstalledUICulture.Parent.LCID.ToString(”X”)).Replace(” “, “0″);

Watch the result. At mine it was “016″.

Then you go to the
registry at this key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Perflib

and create another one with the name you got
from the string.Format result.
In my case:
“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Perflib\016″

and copy the info that is on any other
key in this Perflib to this key you
just created. Run the instalation again.
Done!

Category: Utilities  | Tags: , , , ,  | 2 Comments