2012-11-07 116 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