sexta-feira, 18 de dezembro de 2009

Os Triggers no MSSQL são muito úteis, mas temos de ter algumas precauções no seu uso, porque  ao usarmos  "nested triggers" o SQL Server só nos permite correr até 32 de uma só vez (execmplo um trigger dispara com um insert numa tabela que depois dispara outro trigger para outra tabela e assim sucessivamente até 32).

Podem ser usados para:

  • Inserir (Insert), actualizar (Update), Apagar (Delete)
Se usar a sintaxe AFTER, ou seja depois de uma acção e também podemos usar a sintaxe FOR

Exemplo usando FOR e deleted :

CREATE TRIGGER Save_Deleted_records
 ON dbo.Table_Test
 FOR DELETE
 AS
 INSERT deleted_records_mark
SELECT * FROM deleted





Exemplo usando AFTER

Create TRIGGER dbo.UpdateTrigger ON dbo.Table3 
AFTER INSERT AS 
 BEGIN 
   SET NOCOUNT ON; 
     declare @ticket  as varchar(8) 
     set @ticket = (select callid from inserted)
     update subset set uticketrem = @ticket where custtype<>'Facility' and callid=@ticket
END
  • Instead of Insert, Update, Delete 
Isto quer dizer que poderá uma outra acção se for um insert poderá não fazer nada ou efectuar outra acção.


CREATE TRIGGER Example_Trigger on Table1
INSTEAD OF INSERT
AS
BEGIN
  -- Instead of inserting you can do other operations
  INSERT INTO Table45
       SELECT RowMatCol, Date_Doc
       FROM inserted
END











Bom Natal e Boas Entradas em 2010
Particionado por  IT Tech BuZ






sexta-feira, 30 de outubro de 2009

Hoje trago-vos uma função que é muito util que "pega" na data actual que é executada  e transforma para este formato numa única string YYYYMMDDHHMMSS (example for 30-10-2009  20:01:01 will be 20091030200101).

Use  ASuaBasedeDados
Create function [dbo].[F_DataHora]()
returns varchar(50)
as
begin
declare @datanext varchar(50)
select @datanext =
(select (substring ((select convert(varchar(10),getdate(),103)),7,4)))+  -- Ano
(select (substring ((select convert(varchar(10),getdate(),103)),4,2)))+ -- Mês
((select (substring ((select convert(varchar(10),getdate(),103)),1,2)))+ -- Dia
replace((select convert(varchar(8),getdate(),108) ),':','')) -- hora e mnutos HHMMSS

return @datanext
end  



Depois podemos experimentar e verificar o resultado:

Use ASuaBasedeDados
Go
Select  [dbo].[F_DataHora]()




20091030203830

sexta-feira, 28 de agosto de 2009

Deve usar as melhores praticas quando estamos a elaborar Stored procedures para evitarmos problemas futuros, vamos ver 1º a sintaxe:


Create Procedure Nametheprocedure
-- Parâmetros input or output ( Variaveis )
As
BEGIN TRY
Begin Transaction
-- Comandos
commit transaction -- Se correr sem erros aplica a transacção na base de dados

END TRY

BEGIN CATCH

SELECT ERROR_NUMBER(), ERROR_MESSAGE()

Rollback -- Em caso erro não aplica a transacção

END CATCH

GO

Em baixo está um exemplo para a abase dados Adventure Works

CREATE PROCEDURE Production.AddProductReview
@ProductID int,
@ReviewerName nvarchar(50),
@EmailAddress nvarchar(50),
@Rating int,
@Comments nvarchar(3850)
as


BEGIN TRY
Begin transaction;
INSERT Production.ProductReview (ProductID, ReviewerName, EmailAddress, Rating, Comments)
VALUES (@ProductID, @ReviewerName, @EmailAddress, @Rating, @Comments)
commit transaction;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
rollback transaction;
END CATCH

GO

-- Test stored procedure with error handling
EXECUTE Production.AddReview 715, 'Doug', 'doug@siteexample.com', 10, 'Great product!'
GO

Temas relacionados :

SP para copiar ficheiros

domingo, 26 de julho de 2009

A manipulação da data no SQL Server, vamos ver na pratica alguns exemplos:


-- Exemplo 1
select getdate()

Esta função retorna a data actual 2009-07-26 14:55:03.210

-- Exemplo 2
select GETDATE()+60

Neste exemplo adicionamos 60 dias a data actual e o resultado é 2009-09-24 14:56:40.210

-- Exemplo 3
select DATEADD(M,2,getdate()) -- M month, y year, d day

A função DateAdd function adiciona neste exemplo meses ou dias,ou anos, a data actual ou outra colocada em variável . Então adicionando 2 meses a data corrente o resultado é 2009-09-26 14:57:48.117
a diferença de resultados entre o exemplo 2 e 3 (2 dias), porque no exemplo 2 adicionamos 60 dias e não 2 meses.

-- Exemplo 4
select DATEDIFF(DAY,(DATEADD(M,2,getdate())),(GETDATE()+60))

Esta função calcula a diferença entre datas e retorna um numero inteiro, usando o exemplo o resultado é -2

-- Exemplo 5
SET DATEFORMAT dmy;
GO
DECLARE @datevar datetime
Set @datevar=GETDATE()
select @datevar

Neste exemplo formata-mos a data do tipo dd-mm-aaaa


-- Exemplo 6
select substring((convert(varchar(10),@datevar,127)),1,10)
resultado 2009-07-26

Conversão de tipo de dados de DateTime para varchar(10), usando o parâmetro 127 ( yyyy-mm-dd) que nos indica o formato da data

-- Exemplo 7
select substring((convert(varchar(10),@datevar,103)),1,10)
resultado 26/07/2009

Conversão de tipo de dados de DateTime para varchar(10), usando o parâmetro 103 ( yyyy-mm-dd) que nos indica o formato da data (dd/mm/aaaa)

Mais documentação sobre a função convert em http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

sexta-feira, 5 de junho de 2009

Mais um apontamento nesta rubrica que eu pretendo que seja uma mais valia e como tal acrescente saber. Posto isto, hoje vou-te falar dos Database Triggers estes servem para várias funções referente a auditoria das nossas base de dados em que alteramos as tabelas e necessitamos de colocar numa tabela para efeitos de auditoria. Vou então mostrar-te com um exemplo para evitar que tabelas sejam apagadas ou criadas, atenção é só um exemplo.

Use BaseDados
go
Create TRIGGER [DBTR_Teste_Drop_Create]
ON DATABASE
FOR DDL_TABLE_VIEW_EVENTS
AS
DECLARE @data xml
DECLARE @cmd nvarchar(350)
DECLARE @logMsg nvarchar(400)

SET @data = eventdata()
SET @cmd = @data.value
('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(350)')
SET @logMsg = @cmd + ' (' + SYSTEM_USER + ' on ' + HOST_NAME() + ')'

RAISERROR (@logMsg, 10, 1) WITH LOG

-- Para Visualizar o Comando executado
-- select @cmd

-- Aqui não permitimos criar objectos na base de dados (Exemplo: Create Table)
-- pois efectuamos o rollback

if left(@cmd,6)='Create'

rollback

-- Aqui não permitimos apagar objectos na base de dados (Exemplo: drop table)
-- pois efectuamos o rollback

if left(@cmd,4)='drop'
rollback

Nota: podemos criar uma tabela com as variáveis com o tipo indicado e inserir os erros

terça-feira, 21 de abril de 2009



Sp para copiar ficheiros muito útil

USE [aspnetdb] -- Replace with your DB
GO
/****** Object:  StoredProcedure [dbo].[usp_copiamsg]    Script Date: 04/21/2009 09:22:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create procedure [dbo].[usp_copiamsg]
@msg as varchar(200),
@input as varchar(100)
,@retorno as varchar(200) output
as
Begin 

declare @drive as varchar(100)
declare @drive_dest as varchar(100)
declare @path as varchar(800)
declare @path_dest as varchar(800)
declare @cmd as varchar(800)
declare @ext as char(3)

set @path_dest='\Dest_Path\'
-- Para Exemplo, não esquecer barra de directorio final 
--
set @path='\PROGRA~1\DATA\'
set @drive='c:'
set @drive_dest='d:'
set @cmd='copy '+@drive+@path+@msg+@ext
set @cmd=@cmd+@drive_dest+@path_dest+ltrim(rtrim(@input))+(select  cast(day(getdate())  as varchar(2)))
+(select  cast(month(getdate())  as varchar(2)))
+(select  cast(year(getdate())  as varchar(4)))
+replace((select convert(varchar(8),getdate(),108)),':','')+@ext




-- Para Testar Caminhos e Visualizar
-- select @cmd

exec master..xp_cmdshell @cmd ,no_output

Set @retorno=@drive_dest+@path_dest+ltrim(rtrim(@input))+(select  cast(day(getdate())  as varchar(2)))
+(select  cast(month(getdate())  as varchar(2)))
+(select  cast(year(getdate())  as varchar(4)))
+replace((select convert(varchar(8),getdate(),108)),':','')+@ext

end


segunda-feira, 9 de março de 2009

Depois de uma analise cuidada verifiquei que existe muitos pedidos, ou leitores que passavam por cá, não obtinham a resposta adequada as suas necessidades, por isso cá vai.

Caros o que se deve fazer quando o Windows Vista fica com o Ecrã preto, de certo instalaram alguma aplicação não compativel com o Vista.

A solução mais rápida é efectuar o restauro do sistema depois de entrar em Modo de Segurança.

Vocês perguntam como ?

  1. Desligar o pc e voltar ligar, depois do teste de memória pressionar a tecla F8
  2. Quando o computador ligar e apresentar no ecrã que esta em Modo de Segurança
  3. Seleccionar " Restauro do Sistema"
  4. Escolher o último caso tenha sido muito recentemente, ou escolher outro.
  5. Depois aguarde enquanto o computador repõe o modo de restauro
  6. Quando iniciar normalmente, em principio estará resolvido o problema

Nota Muito Importante:
Os documentos, fotografias e dados de aplicações devem estar salvaguardados através de cópias de segurança.

quarta-feira, 4 de março de 2009

Caros como existe muitas pesquisas sobre este tema aqui vai desta vez com imagens



Vamos ver mais de perto


Convert campo Text para varchar



  • Soma na formula o campo na 1ª posição e agrupa pelo campo2
Whileprintingrecords;
sum ({tabela1.campo1},{tabela1.campo2})

  • Soma dois campos da tabela na formula em baixo
WhilePrintingRecords;
({file.Qty1}+ {file.Qty2})


clique aqui para visualizar uma ajuda



domingo, 18 de janeiro de 2009

Após alguma ausência derivado a diversos acontecimentos profissionais , já reparam que o Blog mudou de nome em virtude do registo do dominio www.ITTechBuZ.com e novo logo.
Este logo transmite a comunicação como grande vertente pilar nas tecnologias de informação com o mundo empresárial e entre todos. Este Blog continua em 2009 a principalmente a publicar para técnicos. Hoje Domingo aproveito para deixar mais um apontamento da rubrica SQL Truques & Dicas com uma SP com um cursor.

SQL Truques & Dicas
Esta sp é para usar para actualizar consumo de horas numa aplicação

--
-- Cria a SP com o nome sp_actualiza_onsite
--
create procedure [dbo].[sp_actualiza_onsite]
as Begin


--
-- Insere Ticket depois de Fechado (Estado 'Closed')
-- Uso um Insert a partir de um Select
--



INSERT INTO [HEAT].[dbo].[Tickets] ([CallId] ,[CallType] ,[CriData] ,[Valor] ,[Saldo] ,[UIDMANUT])


select d.callid,c.calltype,c.closeddate, d.horas_gastas, d.horas_saldo
,d.uidmanut
,c.custid
from detail d

inner join calllog c on c.callid=d.callid
inner join subset s on s.callid=c.callid
inner join config cfg on cfg.u_idreg=d.uidmanut
where (c.calltype='Onsite' or c.calltype='Packs') and c.callstatus='Closed' and c.actualiza<>'SIM'
and c.callid not in (select callid from tickets )

--
-- Actualiza contratos com as Horas Gastas
-- Cursor usado para update
--

-- Declaração do Cursor com o nome de cursor_Tickets
-- Select aonde vai correr o cursor

DECLARE Cursor_tickets CURSOR for
SELECT t.CallId,c.custid,t.Valor,t.UIDMANUT
from tickets t
inner join calllog c on c.callid=t.callid
where t.[CallType]='Onsite' and c.actualiza <>'SIM'

--
-- Declaração de Variaveis para passar do Cursor
--

Declare @Callid varchar(8)
declare @custid varchar(50)
declare @valor decimal(17,2)
declare @uidmanut varchar(25)

set @callid=''
set @custid=''
set @valor=0
set @uidmanut=''


Open Cursor_tickets /* abrir o cursor */

fetch next from Cursor_tickets
into @callid,@custid,@valor,@uidmanut
while @@fetch_Status=0
begin

--- Actualização das Horas Gastas
--- select @valor,@custid,@uidmanut (usado para verificação e teste)

update config set horas_gastas=isnull(@valor,0)+(isnull(horas_gastas,0)) ,horas_saldo=isnull(horas_saldo,0)-isnull(@valor,0)
where u_idreg=@uidmanut and custid=@custid

set @callid=''
set @custid=''
set @valor=0
set @uidmanut=''

fetch next from Cursor_Tickets
into @callid,@custid,@valor,@uidmanut
end
close Cursor_tickets
Deallocate Cursor_tickets

--
-- No Final actualiza a tabela de forma a não repetir os registos já processados
--

update calllog set actualiza='SIM' where callid in (select callid from tickets) and actualiza<>'SIM'


end