如果我在没有字符“|”的脚本下运行 它工作但当我添加字符“|” 如何添加字符“|”不起作用 使用 sql 脚本到文本文件?
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
谢谢
如果我在没有字符“|”的脚本下运行 它工作但当我添加字符“|” 如何添加字符“|”不起作用 使用 sql 脚本到文本文件?
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
谢谢
管道字符在批处理命令中具有特殊含义,因此必须使用脱字符进行转义。这应该有效:
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
虽然这确实不是将数据写入文本文件的好方法:通常 SQL Server 不应该有写入 C: 驱动器根目录的权限,并且xp_cmdshell
默认情况下是禁用的。我建议您查看替代方案,例如sqlcmd.exe
,bcp.exe
或您首选语言(PowerShell、Perl、Python 等)的小脚本。
从 SQL Server 查询数据通常比从服务器端推送数据更容易、更安全、更灵活。在您的特定情况下,您似乎想要写出一个分隔文件,并且bcp.exe
是为此目的而设计的。
其他方式来做到这一点
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
使用 SP 结果检查错误
EXECUTE @result = sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, @File, 8, 1
if @result<>0 GOTO ON_ERROR
虽然还没有找到阅读错误信息的方法
用两对单引号括起来,
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