这是一个有点理论的答案,但也许会有所帮助。简短版本是“在查询中使用参数”,但它有助于理解全部细节。
在标准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中,[方括号]用于相同的目的;括号之间是什么是列或数据库内的任何内容的名称。许多系统比这更灵活;并不是所有的系统在偏离标准方面都是一样的。
请示例SQL代码? – 2008-12-22 20:09:09