2

if i run below script without char "|" it working but when i am adding char "|" it is not working how to add char "|" using sql script to text file ?

DECLARE @Text AS VARCHAR(100)
DECLARE @Cmd AS VARCHAR(100)
SET @Text = 'Hello world| '
SET @Cmd ='echo ' +  @Text + ' > C:\AppTextFile.txt'
EXECUTE Master.dbo.xp_CmdShell  @Cmd

thanks

Jon Egerton
  • 40,401
  • 11
  • 97
  • 129
Yogesh
  • 150
  • 1
  • 4
  • 20

3 Answers3

7

The pipe character has a special meaning in batch commands, so it must be escaped using the caret character. This should work:

DECLARE @Text AS VARCHAR(100)
DECLARE @Cmd AS VARCHAR(100)
SET @Text = 'Hello world^| '
SET @Cmd ='echo ' +  @Text + ' > C:\AppTextFile.txt'
EXECUTE Master.dbo.xp_CmdShell  @Cmd

Although this is really not a good way to write data to a text file: usually SQL Server should not have permission to write to the root of the C: drive, and xp_cmdshell is disabled by default. I suggest you look at alternatives like sqlcmd.exe, bcp.exe or a small script in your preferred language (PowerShell, Perl, Python, whatever).

It is generally much easier, safer and more flexible to query data from SQL Server than it is to push it out from the server side. In your specific case, it looks like you want to write out a delimited file, and bcp.exe is intended for that purpose.

Community
  • 1
  • 1
Pondlife
  • 15,992
  • 6
  • 37
  • 51
  • It's not necessarily a bad practice. This could be used from a stored procedure, to produce a set of files. SQL Server shouldn't have permissions to write anywhere, but it is fine to give it permissions to write a specific directory. – Federico Razzoli Jul 30 '21 at 15:17
4

Other way to do this

DECLARE @File  varchar(300) = 'c:\Temp\out.txt'
DECLARE @Text  varchar(8000) = 'Sample text'
DECLARE @OLE            INT 
DECLARE @FileID         INT

EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT 
EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, @File, 8, 1 
EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, @Text
EXECUTE sp_OADestroy @FileID 
EXECUTE sp_OADestroy @OLE 

Check for errors using SP result

EXECUTE @result = sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, @File, 8, 1
if @result<>0 GOTO ON_ERROR

Haven't found the way to read error message though

Pasetchnik
  • 318
  • 1
  • 9
  • Much better solution if your `@Text` contains lots of characters that don't fit nicely into the command prompt. If you're hitting permission issues with `sp_OACreate` see [this answer](https://stackoverflow.com/a/49873229/930393) – freefaller Aug 12 '20 at 13:36
0

wrap it with two pairs of single quotes,

DECLARE @Text AS VARCHAR(100)
DECLARE @Cmd AS VARCHAR(100)
SET @Text = '''Hello world| '''
SET @Cmd ='echo ' +  @Text + ' > C:\AppTextFile.txt'
EXECUTE Master.dbo.xp_CmdShell  @Cmd
Jon Egerton
  • 40,401
  • 11
  • 97
  • 129
John Woo
  • 258,903
  • 69
  • 498
  • 492