Gå til innhold

MS SQL automatisk funksjon ?


Anbefalte innlegg

Skrevet

Er det mulig å lage en funksjon i MS SQL som trekker ut informasjon, når en post i en tabell inneholder bestemt informasjon, som ekxporterer dette automatisk til en tekstfil eller excel fil ?

 

I tilfelle er det noen som har tips om hvordan dette bør gjøres ?

Videoannonse
Annonse
Skrevet

Ja, du kan løse det med bruk av en trigger som legger raden til i en ny tabell og kaller RAISERROR med en egendefiner errorkode, og ved å definere en Alert i SQL Server Agent som "sniffer" på den gitte errorkoden og starer en jobb når den inntreffer.

Jobben som kalles fra alerten leser data fra denne nye tabellen og skriver dette til en Excel-fil.

 

Du må ikke skrive direkte til Excelfilen i triggeren da dette vil føre til at transaksjonen som skriver til tabellen vil være åpen under skriving til en ekstern ressurs (Excel), og det er dårlig programmeringsteknikk.

 

Ved å bruke RAISERROR vil jobben starte nesten umiddelbart.

Skrevet
Du må ikke skrive direkte til Excelfilen i triggeren da dette vil føre til at transaksjonen som skriver til tabellen vil være åpen under skriving til en ekstern ressurs (Excel), og det er dårlig programmeringsteknikk.

 

Ved å bruke RAISERROR vil jobben starte nesten umiddelbart.

7103215[/snapback]

Dersom dette er snakk om SQL Server 2005 så er det også dårlig programmeringsskikk å bruke SQL Server Agent og RAISERROR til dette. Service Broker vil i mine øyne være et mye bedre valg.

Skrevet
Du må ikke skrive direkte til Excelfilen i triggeren da dette vil føre til at transaksjonen som skriver til tabellen vil være åpen under skriving til en ekstern ressurs (Excel), og det er dårlig programmeringsteknikk.

 

Ved å bruke RAISERROR vil jobben starte nesten umiddelbart.

7103215[/snapback]

Dersom dette er snakk om SQL Server 2005 så er det også dårlig programmeringsskikk å bruke SQL Server Agent og RAISERROR til dette. Service Broker vil i mine øyne være et mye bedre valg.

7103834[/snapback]

 

Selvfølgelig. Forbinder enda "MS SQL" med SQL Server 2000 siden flertall av våre applikasjoner fortsatt kjører 2000.

Skrevet
Det er snakk om SQL Server 2000 ;)

7109901[/snapback]

 

Da er den beste måten å definere en Alert som "sniffer" på en spesifikk error code som du kaller ved å kjøre RAISERROR i triggeren.

 

Hvis du er redd for at dette er dårlig programmeringsskikk så kan du trøste deg med at det var Microsoft selv som foreslo det på et seminar jeg var på :thumbup:

Skrevet
De foreslo det vel, siden det er nesten eneste alternativ, dog et noe "grisete" et.. :p Det er vel også derfor de har kommet med noe nytt ;)

7110855[/snapback]

Vel, Service Broker er jo ganske så mye mer, send meldinger (gjerne i XML-format) mellom servere, og la de gjøre forskjellige operasjoner asynkront. Det er i grove trekk hva Service Broker er, men som en bieffekt kan det brukes til prioritering av jobber lokalt på en server også.

  • 2 uker senere...
Skrevet (endret)

Har nå fått satt inn en prosedyre som skal kunne skrive til textfil. Prosedyren skriver ut teksten som jeg putter inn på en fil, men jeg ønsker at den skal skrive ut resultatet fra en spørring til filen. Når jeg prøver å sette inn et view får jeg feilmelding. Noen som vet hva jeg skal gjøre for å få dette til ?

 

Kjøring av prosdeyren normalt:

 

EXEC [dbo].[sp_AppendToFile] @FileName = 'c:\mintekst.txt', @Text1 = 'Dette er en fin tekst.' 

 

 

Kjøring av prosedyren slik jeg ønsker den (noe lignendes):

 

EXEC [dbo].[sp_AppendToFile] @FileName = 'c:\mintekst.txt', @Text1 = dbo.SM_SingleJobViewV1

 

Feilmelding: Server: Msg 170, Level 15, State 1, Line 1

Line 1: Incorrect syntax near '.'.

 

 

 

Prosedyren:

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

ALTER  PROCEDURE sp_AppendToFile(@Filename varchar(255), @Text1 varchar(255)) AS
DECLARE @FS int, @OLEResult int, @FileID int

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
IF @OLEResult <> 0 PRINT 'Scripting.FileSystemObject'

--Open a file
execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 8, 1
IF @OLEResult <> 0 PRINT 'OpenTextFile'

--Write Text1
execute @OLEResult = sp_OAMethod @FileID, 'Writeline', Null, @Text1
IF @OLEResult <> 0 PRINT 'WriteLine'

EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Endret av tmbn
Skrevet (endret)

Inneholder viewet flere rader?

Er det en eller flere kolonner i viewet som skal skrives til tesktfilen?

Du har satt at @Text parameteret kan være maks 255 tegn. Stemmer det?

 

De du må gjøre er å lese radene og kolonnene ved kjøring av viewet inn i en variabel og deretter sende denne variabelen til sprocen.

 

declare @MyText varchar(255)

select @MyText=kolonne1 from dbo.SM_SingleJobViewV1

EXEC [dbo].[sp_AppendToFile] @FileName = 'c:\mintekst.txt', @Text1 = @MyText

 

EDIT: Måten du setter @MyText variabelen avhenger av om viewet inneholder flere rader og kolonner.

Endret av kaffenils
Skrevet

Kjempe! Det fungerte det med variablen. Men, som du sier så er kanskje ikke Varchar (255) riktig å bruke her. Fikk kun ut en post.

 

Viewet inneholder flere rader og det er flere kolonner som skal skrives til tekstfilen

 

Hva anbefaler du å bruke da ?

Skrevet

Hvis det er flere rader så må verdien til @MyText settes til seg selv pluss verdiene i kolonnene pluss linjeskift.

 

Eks:

 

declare @MyText varchar(255)

set @MyText='' -- Dette fordi initiell verdi er NULL, og hvis en prøver å legge en tekst til NULL så blir resultatet NULL.

select @MyText=@MyText+kolonne1 + kolonne2 + kolonne3 + vhar(13)+char(10) from dbo.SM_SingleJobViewV1

 

 

char(13)+char(10) er linjeskift (crlf).

Skrevet

Hmmm..... Får bare ut en blank fil.. :hmm:

 

Koden min ser sånn ut nå:

 

declare @MyField varchar(255)

set @MyField=''

select @MyField=@MyField+Display2+Display3+Display4+char(13)+char(10) from dbo.SM_SingleJobViewV1



EXEC [dbo].[sp_AppendToFile] @FileName = 'c:\temp\tekst5.txt', @Text1 = @MyField

Skrevet

Det skyldes at en eller annen kolonne i en eller annen rad har verdien NULL.

 

Du kan løse dette på to måter:

1. Legg til SET CONCAT_NULL_YIELDS_NULL OFF i begynnelsen av scriptet.

2. Bruk ISNULL(KolonneX,'') i spørringen.

 

Alternativ 1 er nok det letteste og reneste.

Skrevet

Over så brukes det VARCHAR (255). Hva kan jeg bruke for å takle alle mulige typer i en variabel ? Som f.eks. int, datetime, smallint osv.

Skrevet (endret)
Over så brukes det VARCHAR (255). Hva kan jeg bruke for å takle alle mulige typer i en variabel ? Som f.eks. int, datetime, smallint osv.

7235383[/snapback]

 

Du må bruke varchar/nvarchar og konvertere datetime, int etc til tekst med CONVERT-funksjonen.

Endret av kaffenils

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...