4

我正在尝试使用 SQLCMD.EXE 运行查询,但 LIKE 部分有问题。

WHERE email LIKE '%%@%%'

我认为这是 cmd 提示而不是 SQLCMD.EXE 的错误,因为我收到了错误:

Syntax error "@%'"

我通过指向 bat 文件的 Notepad++ (NppExec) 运行它,如下所示:

H:\scripts\SQL.bat "$(CURRENT_WORD)"

这会导致查询在被 SQLCMD.EXE 调用使用之前用双引号引起来。然后 SQLCMD.EXE 调用在 bat 文件中运行,如下所示:

SQLCMD.EXE -U user -P %pass% -S %server% -Q %sql% -d %table%

除了这LIKE '%%@%%'部分之外,它适用于我使用的任何查询。

更新

我又做了一些测试,并认为我已经将其范围缩小到与.%@.

所以像这样的查询可以正常工作:

  • SELECT name FROM table WHERE name LIKE 'test'
  • SELECT name FROM table WHERE name LIKE 'test%'
  • SELECT name FROM table WHERE name LIKE '%%test'

但是这些会导致错误:

  • SELECT name FROM table WHERE name LIKE '%test'
  • SELECT name FROM table WHERE name LIKE '%test%'

这很好,因为我可以%在查询中加倍,但我已经尝试过%%@%并且%%@%%它们会抛出错误。Syntax error "@'""Syntax error "@%'"",分别。

此外,变量的原因是我包含了一些逻辑,因此它可以检测表名并针对不同的服务器和数据库运行。

这是bat文件

set sql=%1
iff %@index[%sql%,sur_] GT -1 THEN
    SET SERVER=server1
    SET table=tablename
    SET pass=password
else
    SET SERVER=server2
    SET table=tablename
    SET pass=password
endiff
SQLCMD.EXE -U usr -P %pass% -S %server% -Q %sql% -d %table%

奇怪语法的原因是由于命令通过 TCC/LE 运行(见这里)

4

2 回答 2

1

我不太确定您将%s 加倍的原因是什么,但看起来您的意图是在包含@. 如果是这样,您可以尝试重写该子句:

WHERE CHARINDEX('@', email) > 0

如果它是使@事情绊倒的符号,请CHAR(64)改用。

WHERE CHARINDEX(CHAR(64), email) > 0
于 2013-05-25T01:50:17.563 回答
0

使用 sqlcmd 运行查询时,我发现该%符号将被删除。假设您的查询是:

SELECT name FROM table WHERE name LIKE 'test%'

sqlcmd 会将您的查询读取为

SELECT name FROM table WHERE name LIKE 'test'

所以 sqlcmd 不会过滤你的结果。请%%用于查询

SELECT name FROM table WHERE name LIKE 'test%%'

你会得到结果

SELECT name FROM table WHERE name LIKE 'test%'

我已经在 SQLServer 2005 和 2008 上对此进行了测试

于 2015-04-30T08:41:11.847 回答