在 SQL xp_cmdshell 中使用带有 % 运算符的 LIKE 通配符

Using LIKE wildcard with % operator in SQL xp_cmdshell

提问人:Anusha 提问时间:5/31/2023 最后编辑:Anusha 更新时间:5/31/2023 访问量:64

问:

我正在尝试在xp_cmdshell中使用 % 运算符,如下所示。

DECLARE @OutputFilePath nvarchar(max);
SET @OutputFilePath = '\\shared data\Everyone Share\';
DECLARE @ExportSQL nvarchar(max);
SET @ExportSQL = N'
EXEC master.dbo.xp_cmdshell
  ''bcp "SELECT FileID, NAME FROM [Process].[dbo].[Vendor] WHERE FileName LIKE ''%'' + AAMG + ''%''" queryout "' + @OutputFilePath + '\OutputData.csv" -T -c -t -S WIN-db02''
' 

EXEC(@ExportSQL)

但它给我抛出了一个错误,说“%”附近的语法不正确

如果我只是删除 LIKE 部分,整个代码就可以正常工作。

T-SQL 变量 通配符 xp-cmdshell

评论

2赞 Stu 5/31/2023
您是否尝试过通过选择或打印语句来调试语句?
2赞 Charlieface 5/31/2023
老实说,为什么使用TSQL来执行它不是一种通用的脚本语言?只需使用批处理文件或Powershell,例如bcp.exebcp "SELECT FileID, NAME FROM dbo.Vendor WHERE FileName LIKE '%' + AAMG + '%'" queryout ($OutputFilePath + '\OutputData.csv') -T -c -t -S WIN-db02 -d -d "Process"
0赞 zhiguang 5/31/2023
也许尝试用括号将 LIKE 子句括起来,但我不确定是否要从 shell 执行它LIKE ('%AAMG%')
1赞 T N 5/31/2023
百分号字符对 Windows 命令行界面具有特殊含义,这可能会触发错误。尝试将 %s 加倍以转义它们。然后,命令行管理程序在执行最终的 bcp select 语句时,应将它们替换为单个 %s。
1赞 Panagiotis Kanavos 5/31/2023
这样的代码有什么意义?为什么要削弱使用的安全性,而不仅仅是直接执行?还是使用 SSIS?如果要按计划运行导出,SQL Server 代理已允许运行 shell 命令xp_cmdshellbcp

答:

1赞 Squirrel 5/31/2023 #1

(转载自评论,此处更容易阅读)

您需要将单引号加倍%

SET @ExportSQL = N'
EXEC master.dbo.xp_cmdshell
  ''bcp "SELECT FileID, NAME FROM [Process].[dbo].[Vendor] WHERE FileName LIKE ''''%'''' + AAMG + ''''%''''" queryout "' + @OutputFilePath + '\OutputData.csv" -T -c -t -S WIN-db02''
'

看起来 AAMG 是一个常量字符串,而不是列名。在这种情况下,将动态查询更改为

LIKE ''''%AAMG%''''"

评论

0赞 Anusha 5/31/2023
显示无效的列名“AAMG”
0赞 Squirrel 5/31/2023
这是一个常量字符串还是列名?
0赞 Squirrel 5/31/2023
如果这是一个常量字符串,则无需进行串联,只需使用% + AAMG + %LIKE '%AAMG%'
0赞 Anusha 5/31/2023
是的,它是一个常量字符串,''''%AAMG%'''''“就像一个魅力