2009-11-07 91 views
0

我有一個在Dynamic SQl中爲我的應用程序編碼的Proc。它正在使用以他們的姓氏搜索申請人。現在它正在用申請人的姓氏的前兩位數字或全名進行搜索。但是,我有一個問題,搜索他們的姓氏撇號申請人(例如奧康納)。如果客戶嘗試使用O'或O'Connor搜索申請人,則會發生錯誤。他們希望以姓氏搜索每個申請人有或沒有撇號。請幫助我嘗試了一切,但它不工作。下面是使用在proc拉申請我的搜索代碼:撇號的問題

添加通配符如果有必要

if Rtrim(@FirstName) <> '' 
begin 
    If(Len(@FirstName) < 30) and (CharIndex('%', @FirstName) = 0) and @FirstName != '' 
     Set @FirstName = char(39) + @FirstName + '%' + char(39) 
end 

if Rtrim(@LastName) <> '' 
begin 
    If(Len(@LastName) < 60) and (CharIndex('%', @LastName) = 0) and @LastName != '' 
    Set @LastName = Char(39) + @LastName + '%' + char(39) 
end 

現在建立dinamically輸入過濾器底板參數

if Rtrim(@LastName) <> '' 
select @Where = @Where + ' and a.LastName like '+ Rtrim(@LastName) 

回答

3

你需要躲避在構建SQL字符串時輸入字符串中的撇號(基本上替換爲單個'''')

您需要在任何地方關注此選項se將用戶輸入傳遞給SQL Server數據庫作爲其安全問題(SQL注入攻擊)c.f. Bobby Tables

if Rtrim(@LastName) <> '' 
select @Where = @Where + ' and a.LastName like '+ Replace(Rtrim(@LastName),'''','''''') + '' 
+0

我收到下面的錯誤,當我執行Proc。我從Proc打印選擇語句 - 因爲限制 - 我不能在這裏陳述整個語句 - 下面是它打印的姓氏,如: 服務器:消息170,級別15,狀態1,行1 行1 :'O'附近的語法錯誤。 和a.LastName像''O''REILLY%'' – user203671 2009-11-07 14:48:02

+0

你用兩個撇號替換一個撇號嗎?看起來你用雙引號取代它 - 這是不對的 – Murph 2009-11-07 15:23:50

+0

所以,這裏我得到了什麼,當我打印當前代碼與出去添加代碼,你給我.. 服務器:消息170,級別15,狀態1,第1行 第1行:'REILLY'附近語法不正確。 服務器:消息105,級別15,狀態1,行1 未在字符串「'前面加上引號。 和a.LastName like'O'REILLY%' – user203671 2009-11-07 18:02:49

0

我的建議是將寫入包含一個備用列中的查詢,以用於通過任何特殊字符代替了撇號/單引號過濾諸如#。這樣可以讓您保留原始列以防您想要顯示它。

要做到這一點在SQL Server中,你可以做這樣的事情:

Select 
    tbl.strName_Last, 
    REPLACE(tblOrder.strName_Last, '''','#')) as StrLastNameForFilter 
    .... 

然後改變你的代碼,以篩選基於此備用列,用戶提供的過濾字符串中,替換撇號/帶有特殊字符的單引號。