2011-03-28 33 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