Sql server 2005 Microsoft SQL xp#u cmdshell不';我不喜欢带空格的文件名。我能用别的东西代替这个地方吗?
我有一个TSQL代码,它使用BCP从表中转储数据。它看起来很复杂,但它只是为每个表创建一个@command字符串执行一次,然后BCP将表记录转储到磁盘。这是一种快速备份所有表数据的好方法。下面我展示了更容易阅读的解析版本Sql server 2005 Microsoft SQL xp#u cmdshell不';我不喜欢带空格的文件名。我能用别的东西代替这个地方吗?,sql-server-2005,tsql,batch-file,xp-cmdshell,Sql Server 2005,Tsql,Batch File,Xp Cmdshell,我有一个TSQL代码,它使用BCP从表中转储数据。它看起来很复杂,但它只是为每个表创建一个@command字符串执行一次,然后BCP将表记录转储到磁盘。这是一种快速备份所有表数据的好方法。下面我展示了更容易阅读的解析版本 set @command = 'if (''?'' <> ''[dbo].[sysdiagrams]'') BEGIN; create table #result (result nvarchar(2048) null );
set @command =
'if (''?'' <> ''[dbo].[sysdiagrams]'')
BEGIN;
create table #result (result nvarchar(2048) null );
declare @temp nvarchar(1000);
set @temp = ''' + @bcpPath + ' ' + @database + '.dbo.'' +
substring( ''?'', 8, len(''?'')- 8) +
'' out "' + @driveLetter + @drivePath +
'\'' + substring( ''?'', 8, len(''?'')- 8) +
''.out" -c -x -t"|" -Uuser -Ppassword'';
insert into #result (result)
exec xp_cmdshell @temp;
drop table #result;
END;'
exec sp_msforeachtable @command
编辑:
奇怪的是,我放了一个
回音&&代码>在“路径”前面,它工作了(用双引号括起来)。。。。为什么? 尝试为路径中包含空格的部分指定短名称,例如PROGRA~1,而不是程序文件。因此,您的第一条路径类似于C:\PROGRA~1\MI6841~1\90\Tools\Binn\bcp.exe。如果没有空格,应该可以删除引号
如果在包含长目录/文件名的目录中执行dir/x
,则可以获得短的8.3名称。作为解决方法,可以使用subst
subst p: "C:\Program Files\Microsoft SQL Server\"
因此,您不再需要间隔路径
或者你试着找出它失败的原因
exec xp_cmdshell 'cmd /c echo %cmdcmdline% "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\bcp.exe"'
cmdline应该向您显示完整的命令,如果引号已经在那里,那么这应该可以工作
exec xp_cmdshell 'cmd /c "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\bcp.exe" <the rest of your command>'
exec xp\u cmdshell'cmd/c“c:\Program Files\Microsoft SQL Server\90\Tools\Binn\bcp.exe”
您必须在引用的路径之前放置一些内容,以避免错误C:\Program'无法识别…
所以我使用了CALL语句,它对我有效
declare @cmd nvarchar(1000)
set @cmd = 'call "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\bcp.exe" myDB.dbo.'
exec xp_cmdshell @cmd
这种奇怪的结构也在起作用:
exec xp_cmdshell '""%ProgramFiles%\WinRAR\"rar.exe a -v20M "C:\test\test.rar" "C:\test\data\""'
..\bin目录不在您的路径中吗?即使是,第二条路径也可能会将其杀死。可能。如果xp_cmdshell调用bcp时没有路径组件a la“bcp myDB.dbo…”,会发生什么?我问b/c我们使用bcp进行批量加载&它不关心本地或客户端安装中的文件路径中是否有空格。我很想知道为什么Echo?&&预先挂起的修复了它…xp_cmdshell
可以接受多对引号,但不在第一个标记中。请看我的回答:+1,但这取决于当前系统,在下一个系统中,短名称可以完全不同,但是(有趣的是)一位同事在他的机器上检查了这一点,短名称是相同的。我原以为它们一定会有所不同,尤其是Microsoft SQL Server=>MI6841~1,因为我们的软件安装方式大不相同。我想这只取决于安装的顺序,因为在创建时会存储短名称(也是长名称)。请查看(从)-#4从Windows 2000开始,如果已存在至少4个文件或文件夹,且其短名称中的首6个字符相同,则删除的LFN将被截断为基本名称的前2个字母(如果基本名称只有1个字母,则为1个),然后是从文件名的未记录哈希派生的4个十六进制数字,然后是一个波浪号,后跟一个数字,后跟句点“”,后跟分机的前3个字符。你每天都会学到一些新东西。我不知道这一点,不久前我为嵌入式系统上的fat驱动程序添加了一个长文件名支持(但仅用于阅读)。无需将调用附加到命令行参数。只要把文件的路径用双引号括起来就足够了。因此,这应该是有效的:''C:\ProgramFiles\MicrosoftSQLServer\90\Tools\Binn\bcp.exe“myDB.dbo'
exec xp_cmdshell '""%ProgramFiles%\WinRAR\"rar.exe a -v20M "C:\test\test.rar" "C:\test\data\""'