システム内の製品の検索を簡単にするために、全文検索を有効にすることができました。ただし、他の人が作成したspを使用しているため、「DutyCall」の結果が返されません。実際、私はシステム内の製品である「CallofDuty」を探しています。「CallofDuty」と入力すると結果が返されますが、単語を削除して残りの単語を反転しても結果は得られません。コードは次のとおりです。
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
この呼び出しは、次のコードを使用した従来のASPWebページ内で行われます。
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-serverのクエリウィンドウに直接入力します。
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
結果を返します。私はここで私のリーグから外れていて、経験豊富なプログラマーの1人がここで明らかに何か間違っているのを見るかもしれないのではないかと思いました。あなたたちやギャルが提供できるどんな助けでも大歓迎です。
どうもありがとう、
ポール