Jag har behov av att utifrån en förändring i en tabell spara information till en textfil. Om jag lägger in din SP i min databas (på SQL Server 2000) så kan jag lägga till den OK. Tack för hjälpen!Spara ett resultat till en textfil
En trigger anropar en StoredProcedure som jag i sin tur vill ska lägga ut resultatet i en textfil.
I triggern sker följande anrop
...
Execute sp_SaveToFile @Type, @ID, @DATUM
I min Stored Procedure gör jag i dag nedanstående
Create Procedure sp_SaveToFile
(@Type Int, @ID Int, @Datum Char(10))
As
DECLARE @cmd sysname, @Path nvarchar(4000)
SET @Path = 'c:\Testar.txt'
SET @cmd = 'echo ' + @ID + ' - ' + @Datum + ' - Type: ' + @Type+ ' > ' + @Path
EXEC master..xp_cmdshell @cmd
Jag har testat så att triggern anropar min SP. Jag har också testat så att min SP exekveras. Detta testades genom att min SP fick uppdatera ett fält i en tabell, dvs en vanlig Update.
Men så fort jag försöker använda xp_cmdshell så får jag inget resultat.
mvh PerSv: Spara ett resultat till en textfil
Om jag sedan anropar den med
sp_SaveToFile 12, 23, '2005-05-05'
Så får jag felmeddelandet
Server: Msg 245, Level 16, State 1, Procedure sp_SaveToFile, Line 6
Syntax error converting the varchar value 'echo ' to a column of data type int.
Om jag däremot skriver om den så att den konverterar int:arna till strängar med CAST enligt följande:
Create Procedure sp_SaveToFile
(@Type Int, @ID Int, @Datum Char(10))
As
DECLARE @cmd sysname, @Path nvarchar(4000)
SET @Path = 'c:\temp\Testar.txt'
SET @cmd = 'echo ' + CAST ( @ID AS VARCHAR(10) ) + ' - ' + @Datum + ' - Type: ' + CAST ( @Type AS VARCHAR(10) ) + ' > ' + @Path
EXEC master..xp_cmdshell @cmd
så fungerar allt OK. Anledningen till att du inte såg felmeddelandet tidigare kan ha varit att din SP anropades från en trigger, och du inte kollade felstatus i din trigger.
Se även till att den användaren som kör SQL Servern körs som har rättigheter att skapa den filen.
En annan kommentar är att jag skulle rekommendera att du inte har den lokala variabeln @cmd som sysname eftersom det är samma som nvarchar(128), vilket kan bli litet kort eftersom du har ett filnamn med i den istället.
/AndreasSv:Spara ett resultat till en textfil
Utöver de svar du gav så var jag även tvungen att lösa behörighetsfrågan då den användare som jag använder inte är en NT/AD användare och därmed inte får lov att köra xp_cmdshell. Men det finns en möjlighet att i Enterprise Managern ställa in så att en icke NT/AD användare tillåts göra anropet och att detta körs genom den användare som kör/startat SQL Server service.
Men det kräver att behörig DBA aktrivt går in och öppnar upp möjligheten. Jag är osäker på vilka säkerhetsaspekter man ska ställa på denna lösning. Men tillvägagångssättet är beskrivit i online hjälpen.
/Per