使用xp_cmdshell调用sqlcmd时动态输出路径变量语法错误求助
解决动态生成SQLCMD输出文件路径的语法错误问题
你的问题出在直接在xp_cmdshell的字符串参数中拼接变量,SQL Server不支持这种写法。需要先将完整的命令字符串拼接好存入变量,再执行该变量。
修正后的代码如下:
declare @name nvarchar(max); SET @name = 'test1'; -- 先拼接完整的命令字符串 declare @cmd nvarchar(max); SET @cmd = 'sqlcmd -s, -W -Q "set nocount on; select * from [EDI].[dbo].[Vendor]" | findstr /v /c:"-" /b > ''\\shared data\Everyone\' + @name + '.txt'''; -- 执行命令 exec master..xp_cmdshell @cmd;
关键说明:
- 把原本直接写在
xp_cmdshell里的命令拆分为先构建@cmd变量,通过字符串拼接将@name嵌入到输出路径中 - 注意单引号的转义:路径中的单引号用两个连续单引号表示,拼接变量时直接连接即可,不需要额外加单引号包裹(因为前面的路径已经用单引号闭合了一部分,拼接变量后再补全后缀的单引号和
.txt)
关于BCP列头的补充(可选)
如果你之后想换回BCP,解决列头缺失的问题可以这样做:
- 先查询表的列名,将其作为第一行输出
- 用
UNION ALL拼接数据行,注意要把列名转换为和对应列匹配的数据类型,避免列类型不匹配的错误。示例:
-- 假设Vendor表有VendorID(int), VendorName(nvarchar(100))两列 declare @bcp_cmd nvarchar(max); SET @bcp_cmd = 'bcp "SELECT ''VendorID'', ''VendorName'' UNION ALL SELECT CAST(VendorID AS nvarchar(10)), VendorName FROM [EDI].[dbo].[Vendor]" queryout ''\\shared data\Everyone\' + @name + '.txt'' -c -t, -S ' + @@SERVERNAME + ' -T'; exec master..xp_cmdshell @bcp_cmd;
内容的提问来源于stack exchange,提问作者Anusha
相关产品推荐
相关产品推荐

