这是一个理论上的答案,但也许会有所帮助。简短的版本是“在查询中使用参数”,但它有助于理解完整的细节。
在标准 SQL 中,字符串用单引号括起来,嵌入的单引号用一行中的两个单引号表示:
SELECT * FROM SomeWhere
WHERE SomeThing = 'He said, "Don''t do it!"';
在某些 SQL 方言中,您可以改为用双引号关闭字符串;然后,您需要将双引号加倍以嵌入双引号的单个实例:
SELECT * FROM SomeWhere
WHERE SomeThing = "He said, ""Don't do it!""';
从问题中不清楚公司名称是否包括外部双引号以及中间双引号,或者它是否只包含中间双引号。但是,原则上,规则是相同的。假设所有三个双引号都是必需的,并在 SQL 中使用单引号 - 在这种情况下更容易:
SELECT c.companyID, c.companyName, c.dateAdded, count(cm.maxID) as NumDirect
FROM RussoundGeneral.dbo.Company c
LEFT JOIN RussoundGeneral.dbo.CompanyMax cm
ON (cm.companyId = c.companyId and cm.maxID is not null)
WHERE CONTAINS ( companyName, '"BLAH "BLAHBLAH" Ltd.' )
GROUP BY c.companyID, c.companyName, c.dateAdded
ORDER BY c.companyName ASC;
使用双引号:
SELECT c.companyID, c.companyName, c.dateAdded, count(cm.maxID) as NumDirect
FROM RussoundGeneral.dbo.Company c
LEFT JOIN RussoundGeneral.dbo.CompanyMax cm
ON (cm.companyId = c.companyId and cm.maxID is not null)
WHERE CONTAINS ( companyName, """BLAH ""BLAHBLAH"" Ltd." )
GROUP BY c.companyID, c.companyName, c.dateAdded
ORDER BY c.companyName ASC;
如果您正在使用编程语言构建字符串,那么您必须担心这些引号会超出您的编程语言中对字符串进行评估的任何内容。例如,如果您在 C 中构建字符串文字,则必须使用反斜杠转义双引号:
static const char sql_stmt[] =
"SELECT c.companyID, c.companyName, c.dateAdded,\n"
" COUNT(cm.maxID) AS NumDirect\n"
" FROM RussoundGeneral.dbo.Company c\n"
" LEFT JOIN RussoundGeneral.dbo.CompanyMax cm\n"
" ON (cm.companyId = c.companyId AND cm.maxID IS NOT NULL)\n"
" WHERE CONTAINS(companyName, \"\"\"BLAH \"\"BLAHBLAH\"\" Ltd.\")\n"
" GROUP BY c.companyID, c.companyName, c.dateAdded\n"
" ORDER BY c.companyName ASC";
另一方面,如果您从用户那里读取数据 - 例如公司名称,那么您只需确保正确引用读取的内容。
那些说“使用参数”的人是对的——它更容易、更可靠并且更不容易受到 SQL 注入攻击(如果你还没有看到,请参阅XKCD )。但是,如果您了解基本原理,则可以适应系统的实际要求。
最后说明:在标准 SQL 中,双引号包含“分隔标识符”。也就是说,双引号包含一个名称,该名称必须被视为数据库中某物的名称,而不是字符串文字。在 MS SQL Server 中,[方括号] 具有相同的用途;括号之间是列的名称或数据库中的任何内容。许多系统比这更灵活。并非所有系统在偏离标准的方式上都是相同的。