2011-03-28 98 views
1

存储在搜索内容中程序NormalizeChars我想使用此过程如何使用存储过程

ALTER PROCEDURE normalizeChars 
(@NAME NVARCHAR(100)) 
AS 
BEGIN 
    DECLARE @TempString NVARCHAR(100) 
    SET @TempString = @NAME 
    SET @TempString = LOWER(@TempString) 
    SET @TempString = REPLACE(@TempString,'à', 'a') 
    SET @TempString = REPLACE(@TempString,'è', 'e') 
    SET @TempString = REPLACE(@TempString,'é', 'e') 
    SET @TempString = REPLACE(@TempString,'ì', 'i') 
    SET @TempString = REPLACE(@TempString,'ò', 'o') 
    SET @TempString = REPLACE(@TempString,'ù', 'u') 
    SET @TempString = REPLACE(@TempString,'ç', 'c') 
    SET @TempString = REPLACE(@TempString,'''', '') 
    SET @TempString = REPLACE(@TempString,'`', '') 
    SET @TempString = REPLACE(@TempString,'-', '') 
    SET @TempString = REPLACE(@TempString,'ά','α') 
    SET @TempString = REPLACE(@TempString,'έ','ε') 
    SET @TempString = REPLACE(@TempString,'ί','ι') 
    SET @TempString = REPLACE(@TempString,'ό','ο') 
    SET @TempString = REPLACE(@TempString,'ή','η') 
    SET @TempString = REPLACE(@TempString,'ύ','υ') 
    RETURN @TempString 
END 

on ProductsName and ProductsDesc 

是可能,如何这个功能

ALTER PROCEDURE [dbo].[SearchWord] (@Word   NVARCHAR(50), 
            @PageNumber  INT, 
            @ProductsPerPage INT, 
            @HowManyResults INT OUTPUT) 
AS 
    SET @Word = '%' + RTRIM(@Word) + '%'; 

    DECLARE @Results TABLE (
    ProductsId   INT, 
    ProductsCode  NVARCHAR(250), 
    ProductsDesc  NVARCHAR(MAX), 
    ProductsIngredients NVARCHAR(MAX), 
    ProductsName  NVARCHAR(250), 
    ProductsPhoto  NVARCHAR(MAX), 
    ProductsPrice  MONEY, 
    ProductsWeight2  FLOAT, 
    RowNumber   INT) 

    -- Obtain the matching products 
    INSERT INTO @Results 
    SELECT DISTINCT T1.ProductsID, 
        T1.ProductsCode, 
        LOWER(T1.ProductsDesc)      asProductsDesc, 
        T1.ProductsIngredients, 
        LOWER(T1.ProductsName)      AS ProductsName, 
        T1.ProductsPhoto, 
        T1.ProductsPrice, 
        T1.ProductsWeight2, 
        ROW_NUMBER() OVER(ORDER BY T1.ProductsName) RowNumber 
    FROM (SELECT ProductsID, 
       ProductsCode, 
       LOWER(ProductsDesc) AS ProductsDesc, 
       ProductsIngredients, 
       LOWER(ProductsName) AS ProductsName, 
       ProductsPhoto, 
       ProductsPrice, 
       ProductsWeight2 
      FROM Products 
      WHERE ProductsName LIKE @Word) AS T1 
     FULL OUTER JOIN (SELECT * 
          FROM Products 
          WHERE ProductsDesc LIKE @Word) AS T2 
      ON T1.ProductsID = T2.ProductsID 
    ORDER BY T1.ProductsPrice 

    DELETE FROM @Results 
    WHERE NULLIF([ProductsName], '') IS NULL 

    SELECT @HowManyResults = COUNT(*) 
    FROM @Results 

    INSERT INTO @Results 
    SELECT DISTINCT ProductsId, 
        ProductsCode, 
        ProductsDesc, 
        ProductsIngredients, 
        LOWER(ProductsName) AS ProductsName, 
        ProductsPhoto, 
        ProductsPrice, 
        ProductsWeight2, 
        RowNumber 
    FROM @Results 

    SELECT DISTINCT ProductsId, 
        ProductsCode, 
        ProductsDesc, 
        ProductsIngredients, 
        LOWER(ProductsName) AS ProductsName, 
        ProductsPhoto, 
        ProductsPrice, 
        ProductsWeight2, 
        RowNumber 
    FROM @Results R 
    WHERE R.RowNumber > (@PageNumber - 1) * @ProductsPerPage 
     AND R.RowNumber <= @PageNumber * @ProductsPerPage 
    ORDER BY R.ProductsPrice ASC 

删除变音符号?

+1

除删除变音符号的剩余3个字符,如何对搜索过程中指定排序顺序? – 2011-03-28 00:45:27

+1

你的'normalizeChars'过程需要是一个标量UDF(程序不能像这样返回字符串)。但我同意@米奇。 Accent Insensitive整理子句不会为你工作吗? – 2011-03-28 01:00:23

+0

如何指定不区分变音的对比,我认为我有。我已经指定了一个列的通风口,我没有检查字典复选框中的口音。 – ailatzis 2011-03-28 01:12:34

回答

0

你说你在Greek_CI_AI。在这种情况下,大部分映射已经发生(只有前3个不会)。

;WITH T(col1,col2) AS 
(
    SELECT N'''',N'' UNION ALL 
    SELECT N'`',N'' UNION ALL 
    SELECT N'-',N'' UNION ALL 

    SELECT N'à',N'a' UNION ALL 
    SELECT N'è',N'e' UNION ALL 
    SELECT N'é',N'e' UNION ALL 
    SELECT N'ì',N'i' UNION ALL 
    SELECT N'ò',N'o' UNION ALL 
    SELECT N'ù',N'u' UNION ALL 
    SELECT N'ç',N'c' UNION ALL 
    SELECT N'ά',N'α' UNION ALL 
    SELECT N'έ',N'ε' UNION ALL 
    SELECT N'ί',N'ι' UNION ALL 
    SELECT N'ό',N'ο' UNION ALL 
    SELECT N'ή',N'η' UNION ALL 
    SELECT N'ύ',N'υ' 
) 
SELECT * 
FROM T 
WHERE col1<>col2 COLLATE Greek_CI_AI 

返回

col1 col2 
---- ---- 
'  
`  
-  

而且你不需要使用LOWER的排序规则是不区分大小写。

如果确实需要忽略你的搜索,你可以使用一个标量UDF如下

CREATE FUNCTION dbo.normalizeChars 
(@Name NVARCHAR(100)) 
RETURNS NVARCHAR(100) 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    SET @Name = REPLACE(@Name,'''', '') 
    SET @Name = REPLACE(@Name,'`', '') 
    SET @Name = REPLACE(@Name,'-', '') 
    RETURN @Name 
END 
+0

谢谢你马丁。我不得不删除完整的索引并重新设置排序规则,现在一切正常 – ailatzis 2011-03-29 09:31:57