Sql server 2005 Microsoft SQL xp#u cmdshell不';我不喜欢带空格的文件名。我能用别的东西代替这个地方吗?

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 );

我有一个TSQL代码,它使用BCP从表中转储数据。它看起来很复杂,但它只是为每个表创建一个@command字符串执行一次,然后BCP将表记录转储到磁盘。这是一种快速备份所有表数据的好方法。下面我展示了更容易阅读的解析版本

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\""'