tmbn Skrevet 19. oktober 2006 Skrevet 19. oktober 2006 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 ?
kaffenils Skrevet 19. oktober 2006 Skrevet 19. oktober 2006 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.
roac Skrevet 19. oktober 2006 Skrevet 19. oktober 2006 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.
kaffenils Skrevet 19. oktober 2006 Skrevet 19. oktober 2006 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.
kaffenils Skrevet 20. oktober 2006 Skrevet 20. oktober 2006 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å
Manfred Skrevet 20. oktober 2006 Skrevet 20. oktober 2006 De foreslo det vel, siden det er nesten eneste alternativ, dog et noe "grisete" et.. Det er vel også derfor de har kommet med noe nytt
roac Skrevet 20. oktober 2006 Skrevet 20. oktober 2006 De foreslo det vel, siden det er nesten eneste alternativ, dog et noe "grisete" et.. 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å.
tmbn Skrevet 23. oktober 2006 Forfatter Skrevet 23. oktober 2006 (endret) Ikke noe problem med denne koden. Viktigste er at det fungerer. Endret 23. oktober 2006 av tmbn
tmbn Skrevet 31. oktober 2006 Forfatter Skrevet 31. oktober 2006 (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 31. oktober 2006 av tmbn
kaffenils Skrevet 31. oktober 2006 Skrevet 31. oktober 2006 (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 31. oktober 2006 av kaffenils
tmbn Skrevet 31. oktober 2006 Forfatter Skrevet 31. oktober 2006 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 ?
kaffenils Skrevet 1. november 2006 Skrevet 1. november 2006 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).
tmbn Skrevet 1. november 2006 Forfatter Skrevet 1. november 2006 Hmmm..... Får bare ut en blank fil.. 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
kaffenils Skrevet 1. november 2006 Skrevet 1. november 2006 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.
tmbn Skrevet 1. november 2006 Forfatter Skrevet 1. november 2006 Tusen takk Kaffenils! Det fungerte mye bedre. Og Tusen takk for den kjappe SQL leksjonen!
tmbn Skrevet 7. november 2006 Forfatter Skrevet 7. november 2006 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.
kaffenils Skrevet 7. november 2006 Skrevet 7. november 2006 (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 7. november 2006 av kaffenils
tmbn Skrevet 8. november 2006 Forfatter Skrevet 8. november 2006 Kjempebra! Det fungerte som vanlig det. Takk! Hvis du har lyst hadde det vært gøy om du ville kikket litt på denne også: https://www.diskusjon.no/index.php?showtopic=658242&hl= Finner ikke helt ut problemet her.
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå