2012-11-07 166 views
2

我有一個存儲過程,我想允許它*因此如果用戶:允許* SQL查詢

  • 類型T *然後高,茶的回報
  • 類型*或那麼所有的結果返回
  • 類型T接其個人有T的所有結果返回象PTV,高大,坐在

我的存儲過程是這樣的:

ALTER PROCEDURE [dbo].[SearchEntityDataNew] 
    @SearchText varchar(100) = '*' 

AS 
BEGIN 
    SELECT 'Entity' as pagetype,EntityID,EntityData,EntityDataID 
    FROM EntityData 
    WHERE EntityData LIKE '%' + @SearchText+ '%' 
    OR @SearchText = '*' 

    union all 

    SELECT 'Property' as pagetype,PropertyID,PropertyValue,EntityDataID 
    FROM EntityDataProperty 
    WHERE PropertyValue LIKE '%' + @SearchText+ '%' 
    OR @SearchText = '*' 
END 
+0

你的問題到底是什麼? – erikkallen

+0

@erikkallen允許*獲得所有結果,t *獲得t等相關信息。 – DotnetSparrow

+0

您是否運行過該操作,您遇到了哪些挑戰?我認爲你在正確的道路上 – codingbiz

回答

3

你能不能用:

WHERE PropertyValue LIKE REPLACE(@SearchText, '*', '%'); 

以下測試:

-- SAMPLE TABLE 
DECLARE @T TABLE (A VARCHAR(100)); 
INSERT @T VALUES ('tea'), ('test'), ('foo'), ('bar'), ('foobar'); 

-- TEST USING WILDCARD AT END 
DECLARE @SearchText VARCHAR(100) = 't*'; 
SELECT * 
FROM @T 
WHERE A LIKE REPLACE(@SearchText, '*', '%'); 

-- TEST USING ONLY WILD CARD 
SET @SearchText = '*'; 
SELECT * 
FROM @T 
WHERE A LIKE REPLACE(@SearchText, '*', '%'); 

--TEST USING WILD CARD AT START 
SET @SearchText = '*bar'; 
SELECT * 
FROM @T 
WHERE A LIKE REPLACE(@SearchText, '*', '%'); 

--TEST USING WILD CARD AT START AND END 
SET @SearchText = '*a*'; 
SELECT * 
FROM @T 
WHERE A LIKE REPLACE(@SearchText, '*', '%'); 

輸出:

-- Wild card at end: "t*" 
tea 
test 

-- Wild card only: "*" 
tea 
test 
foo 
bar 
foobar 

-- Wild card at start: "*bar" 
bar 
foobar 

-- wild card at start and end: "*a*" 
tea 
bar 
foobar 

編輯

我剛纔重讀你的問題,並看到了要求,即當沒有通配符是同時存在於開始承擔通配符和最後,在這種情況下,你可以添加到這個過程的開始:

IF CHARINDEX('*', @SearchText) = 0 
    SET @SearchText = '%' + @SearchText + '%' 
ELSE 
    SET @SearchText = REPLACE(@SearchText, '*', '%') 

然後只需使用

WHERE PropertyValue LIKE @SearchText