0

Мне только удалось включить полнотекстовый поиск, чтобы облегчить поиск продуктов в моей системе. Тем не менее, я использую sp, который был создан кем-то другим, и он не возвращает никаких результатов для «Duty Call». На самом деле я ищу «Call of Duty», продукт в системе. Если я набираю «Call of Duty», то делает возвращает результат, но удаление слова и переворачивание оставшихся слов не дает результатов. Код выглядит следующим образом:хранится proc не возвращает результатов, но запрос

USE [storeboard] 
GO 
/****** Object: StoredProcedure [sbuser].[sp_ProductSearch] Script Date: 08/26/2010 05:57:20 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROC [sbuser].[sp_ProductSearch] 
    @StoreItemID bigint = null, 
    @StoreMemberID bigint = null, 
    @ProductName varchar(50) = null, 
    @ProductDesc varchar(1000) = null, 
    @ItemPrice float = null, 
    @Active bit = null, 
    @Deleted bit = null, 
    @CreateDate datetime = null, 
    @ShipWeight float = null, 
    @TaxExempt bit = null, 
    @ShipCost float = null, 
    @Keywords varchar(1000) = null, 
    @PG int = 1, 
    @ROWCT numeric(18,2) = 1, 
    @COLCT numeric(18,2) = 1, 
    @MODE varchar(50), 
    @StoreItemCatID bigint = null, 
    @SearchStr varchar(100) = null 

AS 


IF @MODE = 'S1'  
    BEGIN 
     SELECT 
     StoreItemID, 
     ProductName, 
     ItemPrice, 
     PG, 
     MAXPG, 
     TOTALRECS, 
     CoverImg, 
     StoreItemCatID, 
     Active 
     FROM sbuser.tf_ProductSearch(@PG,@ROWCT,@COLCT,@StoreItemCatID,@SearchStr) 
    END 

код относится к tf_productSearch, который это:

USE [storeboard] 
GO 
/****** Object: UserDefinedFunction [sbuser].[tf_ProductSearch] Script Date: 08/26/2010 05:46:36 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [sbuser].[tf_ProductSearch] (
    @PG int, 
    @ROWCT numeric(18,2), 
    @COLCT numeric(18,2), 
    @StoreItemCatID bigint, 
    @SearchStr varchar(100) = null) 

RETURNS @OUT TABLE (
    StoreItemID bigint, 
    ProductName varchar(50), 
    ProductDesc varchar(1000), 
    ItemPrice float, 
    Active bit, 
    CreateDate datetime, 
    ShipWeight float, 
    TaxExempt bit, 
    ShipCost float, 
    Keywords varchar(1000), 
    PG int, 
    MAXPG INT, 
    TOTALRECS INT, 
    CoverImg varchar(50), 
    StoreItemCatID bigint) 

AS 

BEGIN 

     DECLARE @START numeric(18,2); 
     DECLARE @END numeric(18,2); 
     DECLARE @SIZE numeric(18,2); 
     DECLARE @MAXPG numeric(18,2); 
     DECLARE @TOTALRECS numeric(18,2); 
     DECLARE @TOTALRECS_INT int; 
     DECLARE @MAXPG_INT int; 
     DECLARE @TOTALRECS_REMAINDER numeric(18,2); 
     SET @SIZE = @ROWCT * @COLCT 
     SET @Start = (((@PG - 1) * @Size) + 1) 
     SET @END = (@START + @SIZE - 1) 


     DECLARE @TMP1 TABLE (
     TmpID bigint identity(1,1) primary key, 
     StoreItemID bigint, 
     ProductName varchar(50), 
     ProductDesc varchar(1000), 
     ItemPrice float, 
     Active bit, 
     CreateDate datetime, 
     ShipWeight float, 
     TaxExempt bit, 
     ShipCost float, 
     Keywords varchar(1000), 
     CoverImg varchar(50), 
     StoreItemCatID bigint) 


     IF @StoreItemCatID IS NULL 
      BEGIN 
       INSERT INTO @TMP1 
       SELECT 
       a.StoreItemID, 
       a.ProductName, 
       a.ProductDesc, 
       a.ItemPrice, 
       a.Active, 
       a.CreateDate, 
       a.ShipWeight, 
       a.TaxExempt, 
       a.ShipCost, 
       a.Keywords, 
       sbuser.sf_StoreItemCoverImg(a.StoreItemID) AS CoverImg, 
       a.StoreItemCatID 
       FROM sbuser.StoreItem a 
       WHERE FREETEXT (a.ProductName, @SearchStr) 
       AND Deleted = 0  
       AND Active = 1 
       ORDER BY a.ProductName 
      END 
     ELSE 

      BEGIN 
       INSERT INTO @TMP1 
       SELECT 
       a.StoreItemID, 
       a.ProductName, 
       a.ProductDesc, 
       a.ItemPrice, 
       a.Active, 
       a.CreateDate, 
       a.ShipWeight, 
       a.TaxExempt, 
       a.ShipCost, 
       a.Keywords, 
       sbuser.sf_StoreItemCoverImg(a.StoreItemID) AS CoverImg, 
       a.StoreItemCatID 
       FROM sbuser.StoreItem a 
       WHERE FREETEXT (a.ProductName, @SearchStr) 
       AND a.StoreItemCatID = @StoreItemCatID 
       AND a.Deleted = 0  
       AND a.Active = 1 
       OR a.StoreItemCatID IN (SELECT StoreItemCatID FROM StoreItemCat WHERE ParentID = @StoreItemCatID) 
       AND FREETEXT (a.ProductName, @SearchStr) 
       AND a.Deleted = 0  
       AND a.Active = 1 
       ORDER BY a.ProductName 
      END 



     SELECT @TOTALRECS = MAX(TMPID) FROM @TMP1 
     SELECT @MAXPG = @TOTALRECS/@SIZE 
     SET @TOTALRECS_REMAINDER = @TOTALRECS % @SIZE 

     SET @MAXPG_INT = CAST(@MAXPG AS INT) 
     SET @TOTALRECS_INT = CAST(@TOTALRECS AS INT) 


     IF @TOTALRECS_REMAINDER > 0 
      BEGIN 
       SET @MAXPG_INT = @MAXPG_INT + 1 
      END   



     INSERT INTO @OUT 
     SELECT 
      StoreItemID, 
      ProductName, 
      ProductDesc, 
      ItemPrice, 
      Active, 
      CreateDate, 
      ShipWeight, 
      TaxExempt, 
      ShipCost, 
      Keywords, 
      @PG, 
      @MAXPG_INT, 
      @TOTALRECS_INT, 
      CoverImg, 
      StoreItemCatID 
      FROM @TMP1 
      WHERE (TmpID >= @Start) AND (TmpID <= @END)   

    RETURN 


END 

Этот вызов внутри классического веб-страницы ASP с помощью следующего кода:

Dim ProductCat 
Dim paryProducts 
Dim ProdMaxPG 
Dim pstrProductList 

Const C_PRODUCTS_FE_PRODUCTROWCOUNT = 4 
Const C_PRODUCTS_FE_PRODUCTCOLCOUNT = 5 
SearchStr = "duty call" 
StoreItemCatID = "" 

cData.SQL = "sp_ProductSearch " _ 
      & cData.ProcFld("MODE","S1",2,True) _ 
      & cData.ProcFld("PG",PG,0,True) _ 
      & cData.ProcFld("ROWCT",C_PRODUCTS_FE_PRODUCTROWCOUNT,0,True) _ 
      & cData.ProcFld("COLCT",C_PRODUCTS_FE_PRODUCTCOLCOUNT,0,True) _ 
      & cData.ProcFld("SearchStr",SearchStr,2,True) _ 
      & cData.ProcFld("StoreItemCatID",StoreItemCatID,0,False) 
paryProducts = cData.RSArray() 

Однако эти сценарии не дают никаких результатов. Тем не менее, введя следующий код непосредственно в окне запроса на SQL-сервере:

USE storeboard 
GO 
DECLARE @SearchStr varchar(50) 
SET @SearchStr = 'duty call'; 
SELECT 
       a.StoreItemID, 
       a.ProductName, 
       a.ProductDesc, 
       a.ItemPrice, 
       a.Active, 
       a.CreateDate, 
       a.ShipWeight, 
       a.TaxExempt, 
       a.ShipCost, 
       a.Keywords, 
       a.StoreItemCatID 
       FROM sbuser.StoreItem a 
       WHERE FREETEXT (a.ProductName, @SearchStr) 
       AND a.Deleted = 0  
       AND a.Active = 1 
       ORDER BY a.ProductName 

делает возвращает результат. Я из моей лиги здесь и задавался вопросом, может ли один из вас опытных программистов увидеть что-то явно неправильное здесь. Любая помощь, которую могут оказать вам ребята или девочки, будет очень благодарна.

Большое спасибо,

Пол

+0

Не могли бы вы попытаться сократить это на меньший пример - здесь есть много чего читать, и я не думаю, что многие будут упорствовать. –

+0

Я не уверен, что могу сократить его размер, так как весь этот код имеет значение. – neojakey

ответ

0

Хорошо, это не переписывание, потому что у меня нет ни времени, ни требования, чтобы удовлетворить ваши потребности, но вот несколько советов ...

  1. Избавьтесь от стола значных функции если вам это не нужно; переместите эту логику в свою хранимую процедуру.

  2. Избавьтесь от вашего оператора IF @StoreCatItem IS NULL и используйте конструкцию как WHERE (@StoreCatItem IS NULL OR a.StoreItemCatID = @StoreCatItem) вместо этого в своем предложении WHERE, чтобы закрепить в 1 инструкцию SELECT. Если вы намерены поощрять использование соответствующего индекса, добавьте подсказку OPTION(RECOMPILE) в конец вашего запроса вместо дублирования sql.

  3. Я вижу, что вы выполняете пейджинг в своей хранимой процедуре. Таблица temp - хорошая идея, но измените ее определение и ваш запрос на вставку, чтобы включить только первичные ключевые значения полного набора результатов, упорядоченного по правильной схеме, плюс столбец IDENTITY, но вам, скорее всего, просто нужен столбец INT, а не BIGINT, не то, что это имеет большое значение здесь на временной таблице. Первый запрос, который вставляет в вашу переменную таблицы, вы фильтруете с условием WHERE. Используйте описанную выше конструкцию так же, как и для каждого из ваших критериев.

  4. Заключительный оператор выбора, который возвращает ваши записи, должен делать простое ВХОДНОЕ СОЕДИНЕНИЕ между ключами, которые у вас есть в переменной таблицы и вашими реальными данными; здесь вы выбираете все реальные поля, которые вам нужны, и вам не нужно снова повторять свои критерии, так как соединение будет фильтровать ваши результаты.

  5. Невозможно заменить итеративное создание, если вы просто учитесь. Начните с того, что вы знаете, и работаете над этим.

Наслаждайтесь!

+0

С вашим удивительным советом я решил проблему. Много спасибо Tahbaza – neojakey

0

элементы вашего ИНЕКЕ в вашей tf_ProductSearch функции повторяются/ассоциирования логики неправильно в ELSE части (он не совпадает с рабочим запроса). Это может быть проблемой.

+0

ОК, так как бы вы переписали это, так как это все очень ново для меня .. Пожалуйста, помогите мне решить это. – neojakey

+0

Переписывание - это другая история (например, я не знаю, почему у вас есть табличная функция на всех, но я также не знаком с вашими требованиями ...) Чтобы получить то, что у вас есть, отлаживайте его, тестируя свою функцию tf_ProductSearch самостоятельно. Возьмите свой рабочий запрос и поместите его в свою функцию, временно комментируя/* */запросы, которые не работают. Когда это работает, начните сравнивать различия и добавить обратно то, что вам нужно. Удачи! – Tahbaza

+0

Я слышал, хотя у меня есть 2 недели опыта работы с t-sql. Я был бы очень рад видеть, как вы это напишете. Пожалуйста, покажи мне, я в отчаянии! – neojakey