January 19, 2005 at 5:56 pm
I am trying to write multiple lines to a DOS file with xp_cmdshell. This works:
DECLARE @cmd varchar(255)
SET @cmd = 'echo line 1 > C:\outfile.txt' -- overwrites the file if present
EXEC master..xp_cmdshell @cmd
SET @cmd = 'echo line 2 >> C:\outfile.txt' -- appends to the file
EXEC master..xp_cmdshell @cmd
Is there a way to somehow concatenate the lines into one string and call xp_cmdshell once? I tried this, and it does not work:
DECLARE @cmd varchar(255)
SET @cmd = 'echo line 1' + CHAR(13) + CHAR(10) + 'echo line 2' > C:\outfile.txt' -- overwrites the file if present
EXEC master..xp_cmdshell @cmd
Any ideas? I can write to a temp table, then bcp out, but that seems like overkill to write just a few lines. Besides, the second method above really oughta work.
January 19, 2005 at 10:09 pm
Tried and failed - same as you. How irritating!
January 19, 2005 at 11:16 pm
You're not just whistling, Phil.
I have tried every variation of CHAR(13) + CHAR(10), and every example of ECHO I could find. No joy.
January 20, 2005 at 8:57 am
Maybe silly, but if your input strings are short enough you could use the | operator to separate several commands on one line:
line 1 > C:\outfile.txt|line 2 >> C:\outfile.txt|line 3 >> C:\outfile.txt
... and so on out to, what, 255 characters?
<Shrug> I don't believe xp_cmdshell is intended to be an actual shell interface for SQL Server. Just a single command-line.
-SJT
January 20, 2005 at 11:19 am
Sauron: I tried your example, and QA went off for five minutes or so, then gave me a "timeout" message and broke the connection. I'm not sure what I might have done wrong there. FWIW, I am sure xp_cmdshell is still the original version that a summer intern cranked out in a latte fueled frenzy in 1987, but it's all we've got.
Everyone got their airsickness bags handy? Here's what worked:
DECLARE @Command nvarchar(2000)
, @LineConnector nchar(1)
, @FileCreateChar nchar(1)
, @FileAppendString nchar(2)
, @FilePath nvarchar(120)
SELECT @LineConnector = '&', @FileCreateChar = '>', @FileAppendString = '>>',
@FilePath = '\\Servername\DATA\IDBR\ExtractFiles\outfile.txt'
SET @Command = 'ECHO line1' + @FileCreateChar + @FilePath + @LineConnector
+ 'ECHO line2' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line3' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line4' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line5' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line6' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line7' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line8' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line9' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line10' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line11' + @FileAppendString + @FilePath + @LineConnector
+ 'ECHO line12' + @FileAppendString + @FilePath + @LineConnector
exec master..xp_cmdshell @Command, NO_OUTPUT
"Coyote ugly".
January 20, 2005 at 4:54 pm
Is it worth it?
January 20, 2005 at 7:11 pm
Hey, I found this link that had an interesting proc. You could change it up a bit to work for you...
Usage:
EXEC master.dbo.write_to_file @sqlErr,@errFile ,0 --Where @sqlErr is a
varchar string, @errFile is path-filename for file, 0 is append (1 is
overwrite as stated in SP)
SP:
CREATE PROC write_to_file
@msg VARCHAR(7999),
@file VARCHAR(100),
@overwrite BIT = 0
AS
/*
Date written: January 12th 2001
Purpose: To log messages to text files from stored
procedures/triggers/sql scripts
Input parameters: message, file name, overwrite flag (1 to overwrite, 0
to append to file, 0 is the default)
Example: EXEC write_to_file 'Duplicates found','C:\logfile.txt',0
Tested on: SQL Server Version 7.0, 2000
Remarks: You should have permissions required through access file system
through xp_cmdshell
See SQL Server Books Online for xp_cmdshell if you are having
problems with this procedure
*/
BEGIN
SET NOCOUNT ON
DECLARE @execstr VARCHAR(255)
SET @execstr = RTRIM('echo ' + COALESCE(LTRIM(@msg),'-') + CASE WHEN
(@overwrite = 1) THEN ' > ' ELSE ' >> ' END + RTRIM(@file))
EXEC master..xp_cmdshell @execstr
SET NOCOUNT OFF
END
EXEC write_to_file 'Line1 ','C:\test.txt',0
EXEC write_to_file 'Line2 ','C:\test.txt',0
EXEC write_to_file 'Line3 ','C:\test.txt',0
EXEC write_to_file 'Line4 ','C:\test.txt',0
This may not solve your problem, but thought it was an interesting little proc.
Good luck!
Rich
January 20, 2005 at 10:46 pm
michanne: Sure it's worth it, if it gets done what I need done.
Rich: Thanks, that is certainly handy and dandy.
January 21, 2005 at 2:28 am
Try this
DECLARE @cmd varchar(255)
SET @cmd = 'echo line 1 > C:\outfile.txt && echo line 2 >> C:\outfile.txt'
EXEC master..xp_cmdshell @cmd
Far away is close at hand in the images of elsewhere.
Anon.
January 29, 2015 at 8:54 am
This just saved my bacon -- had to restore a db from a gzipped backup without admin rights to a server.
Thanks!!!!
Viewing 10 posts - 1 through 10 (of 10 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy