2010-08-27 78 views
0

我想編寫一個接受@searchString參數的存儲過程。這將是一個varchar(100)並將包含一個查詢值。我怎麼能寫SP,以便它可以這樣做:SQL 2005 - 搜索字符串

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE a.ApplicationId = @searchString 
OR app.Name like '@searchString%' 
OR app.PostCode like '@searchString%' 

這個問題對我來說是如何處理的事實,搜索字符串可以包含一個標識,這將是一個int或可能是一個字符串值。

+0

你有什麼方法可以傳遞某些東西來表明它應該反對什麼字段?如果是這樣,那麼你可以在where中使用case語句。 – spinon 2010-08-27 08:54:52

+0

我的計劃是通過只有一個搜索字符串可以用於搜索幾個關鍵字段來簡化用戶界面 – 2010-08-27 09:17:12

回答

0

我解決了這個創造另一個局部變量,如果搜索字符串是數字,將其轉換,如果沒有設置爲零(我知道一個ID將不存在)。

declare @id int 
if ISNUMERIC(@searchString) = 1 
    set @id = CONVERT(int, @searchString) 
else 
    set @id = 0 

然後where子句中的樣子:

WHERE 
    a.ApplicationId = @id 
    OR app.Surname like @searchString + '%' 
    OR app.Forenames like '%' + @searchString + '%' 
0

您可以將選擇放在一起作爲正確引用的字符串,然後使用sp_executesql來運行它。

但請注意,SQL注入的潛力是有限的!

0
You can check that searchString has only numbers by using PATINDEX and then only compare with applicationId 

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE (PATINDEX('%[^0-9]%', @searchString) = 0 AND a.ApplicationId = @searchString) 
OR app.Name like @searchString + '%' 
OR app.PostCode like '@searchString + '%' 
+0

問題是,PATINDEX之後的AND不是有條件的,因此會導致轉換錯誤 – 2010-08-27 09:30:45

0

關於通過存儲的過程的XML輸入參數是什麼?這樣,當你「解壓縮」XML時,你將能夠控制數據類型並適當地處理ID或文本。

0
SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE a.ApplicationId = 
    case when ISNUMERIC(@searchString) 
    then 
    CONVERT(int, @searchString) 
    else 
    0 
    end 
OR app.Name like @searchString + '%' 
OR app.PostCode like @searchString + '%' 
0

爲什麼不把你的int作爲一個字符串?

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE cast(a.ApplicationId as varchar(100)) = @searchString 
OR cast(app.Name as varchar(100)) like '@searchString%' 
OR cast(app.PostCode as varchar(100)) like '@searchString%'