Sud*_*amy 1 sql-server-2008 sql-server t-sql xp-cmdshell
以下代码用于在文本文件中写入数字,而是将“Echo is ON”写入文本文件。
SET @CMD = 'ECHO '+@Ver+'>'+@Vercheck
Print @CMD
EXEC xp_cmdshell @CMD
,NO_OUTPUT
Run Code Online (Sandbox Code Playgroud)
打印@CMD 给出“ECHO 1>C:\Pharmsuite\Vercheck.txt”
这里查询写的是“Echo is ON”而不是 1。
这个命令: ECHO 1>C:\Pharmsuite\Vercheck.txt
不做你认为应该做的事情,因为 1> 有特殊的含义。
这个问题可以通过在之前添加一个空格来解决>:
ECHO 1 >C:\Pharmsuite\Vercheck.txt
Run Code Online (Sandbox Code Playgroud)
或者在你的情况下:
SET @CMD = 'ECHO '+@Ver+' >'+@Vercheck
Run Code Online (Sandbox Code Playgroud)
它也适用于这个命令(确保ECHO[感谢 Andriy M]之前有一个空格):
SET @CMD = '>'+@Vercheck+' ECHO '+@Ver
Run Code Online (Sandbox Code Playgroud)
你应该看看:
数字句柄:
STDIN = 0 键盘输入
STDOUT = 1 文本输出
STDERR = 2 错误文本输出
UNDEFINED = 3-9command 2> filename 将任何错误消息重定向到文件中
command 2>> filename 将任何错误消息附加到文件中
(命令)2> filename 将任何 CMD.exe 错误重定向到一个文件中
无论如何,您应该避免使用xp_cmdshell. 如果你想输出一些东西,Powershell 或 SQL Server 命令行命令是更好的选择。
使用 Powershell 和Invoke-Sqlcmd:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"
Run Code Online (Sandbox Code Playgroud)
您显然必须使其适应您自己的要求,并且您还必须使用 osql 查看 Daniel Hutmacher 的答案。
替代解决方案
xp_cmdshell您可以从命令提示符运行以下内容,而不是使用会带来很多安全风险的 :
osql >output_file.txt -S myServer\myInstance -E -Q "PRINT @@VERSION"
Run Code Online (Sandbox Code Playgroud)
-S 开关表示服务器和实例的名称,-E 表示 Windows 身份验证(您可以使用 -U 和 -P 代替用户名和密码),而 -Q 是实际查询。请注意,我使用 PRINT 而不是 SELECT 来去除列标题。
显然,您可以用任何有效的 T-SQL 代码替换“PRINT @@VERSION”。
小智 5
问题是,1>有特定的含义。这意味着“重定向标准输出”,而2>将是“重定向标准错误”。>本身是 的简写1>。
你可以试试:
SET @CMD = 'ECHO>'+@Vercheck + ' ' + @Ver
Run Code Online (Sandbox Code Playgroud)
由于您可以在其余参数之前执行重定向到echo.