這是一個有點理論的答案,但也許會有所幫助。簡短版本是「在查詢中使用參數」,但它有助於理解全部細節。
在標準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