2010-10-28 77 views
0

我有一个关于在SQL中搜索的问题。我们有一段代码负责搜索我们网站内的一组内容。当我们写出StaticContent算法时,它运行良好。在添加ContribContent(第2和第4个参数)之后,它似乎不起作用。你有什么想法,为什么?带有新的SearchContent函数的SQL搜索问题

非常感谢!

ALTER PROCEDURE [dbo].[SearchContent] 
    @PageNumber tinyint, 
    @ResultsPerPage tinyint, 
    @HowManyResults smallint output, 
    @AllWords bit, 
    @Word1 varchar(15) = null, 
    @Word2 varchar(15) = null, 
    @Word3 varchar(15) = null, 
    @Word4 varchar(15) = null, 
    @Word5 varchar(15) = null 
    AS 
    BEGIN 
    DECLARE @Content TABLE 
    (RowNumber smallint IDENTITY (1,1) NOT NULL, 
    ContentID int, 
    Title varchar(50), 
    UserID int, 
    Summary text, 
    FirstName varchar(50), 
    LastName varchar(50), 
    Picture varchar(100), 
    Type varchar(50), 
    Rank int 
) 

IF @AllWords = 0 
INSERT INTO @Content 
SELECT ContribContent.ContentID, ContribContent.Title, ContribContent.UserID, 
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Contributed Content' AS Type, 
3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article) + 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) + 
3 * dbo.WordCount(@Word3, Title) + dbo.WordCount(@Word3, Article) + 
3 * dbo.WordCount(@Word4, Title) + dbo.WordCount(@Word4, Article) + 
3 * dbo.WordCount(@Word5, Title) + dbo.WordCount(@Word5, Article) 
AS Rank 
FROM ContribContent 
INNER JOIN Users 
ON ContribContent.UserID = Users.UserID 
ORDER BY Rank DESC 

IF @AllWords = 0 
INSERT INTO @Content 
SELECT StaticContent.ContentID, StaticContent.Title, StaticContent.UserID, 
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Static Content' AS Type, 
3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article) + 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) + 
3 * dbo.WordCount(@Word3, Title) + dbo.WordCount(@Word3, Article) + 
3 * dbo.WordCount(@Word4, Title) + dbo.WordCount(@Word4, Article) + 
3 * dbo.WordCount(@Word5, Title) + dbo.WordCount(@Word5, Article) 
AS Rank 
FROM StaticContent 
INNER JOIN Users 
ON StaticContent.UserID = Users.UserID 
ORDER BY Rank DESC 

IF @AllWords = 1 
INSERT INTO @Content 
SELECT ContribContent.ContentID, ContribContent.Title, ContribContent.UserID, 
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Contributed Content' AS Type, 
(3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article)) * 
CASE 
WHEN @Word2 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END * 
CASE 
WHEN @Word3 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END * 
CASE 
WHEN @Word4 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END * 
CASE 
WHEN @Word5 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END 
AS Rank 
FROM ContribContent 
INNER JOIN Users 
ON ContribContent.UserID = Users.UserID 
ORDER BY Rank DESC 

IF @AllWords = 1 
INSERT INTO @Content 
SELECT StaticContent.ContentID, StaticContent.Title, StaticContent.UserID, 
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Static Content' AS Type, 
(3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article)) * 
CASE 
WHEN @Word2 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END * 
CASE 
WHEN @Word3 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END * 
CASE 
WHEN @Word4 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END * 
CASE 
WHEN @Word5 IS NULL THEN 1 
ELSE 
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
END 
AS Rank 
FROM StaticContent 
INNER JOIN Users 
ON StaticContent.UserID = Users.UserID 
ORDER BY Rank DESC 

SELECT @HowManyResults = Count(*) 
FROM @Content 
WHERE Rank > 0 

SELECT ContentID, Title, Title, UserID, Summary, FirstName, LastName, Picture, Type, Rank 
FROM @Content 
WHERE Rank > 0 AND RowNumber BETWEEN (@PageNumber-1) * @ResultsPerPage+1 AND @PageNumber * @ResultsPerPage 
ORDER BY Rank DESC 
END 
+0

“它似乎没有工作” - 什么是实际问题? – 2010-10-28 00:33:35

+0

好吧,它不像静态一样搜索。在搜索时,它会正确地返回StaticContent,但是对于这个SP的ContribContent – sthomps 2010-10-28 00:37:03

+0

什么都没有,它究竟做了什么? – yonan2236 2010-10-28 01:31:27

回答

0

我不是数据库专家,但有时它有助于推出它。

例如,出现ContribContent的第二部分,因为这(I它重新格式化为我的缘故):

IF @AllWords = 1 
INSERT INTO @Content 
SELECT 
    ContribContent.ContentID, 
    ContribContent.Title, 
    ContribContent.UserID, 
    SUBSTRING(Article, 1, 300) + '...' AS Summary, 
    Users.FirstName, 
    Users.LastName, 
    Users.Picture, 
    'Contributed Content' AS Type, 
    (
     (3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article)) * 

     CASE 
      WHEN @Word2 IS NULL THEN 1 
     ELSE 
      3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
     END 

     * 

     CASE 
      WHEN @Word3 IS NULL THEN 1 
     ELSE 
      3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
     END 

     * 

     CASE 
      WHEN @Word4 IS NULL THEN 1 
     ELSE 
      3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
     END 

     * 

     CASE 
      WHEN @Word5 IS NULL THEN 1 
     ELSE 
      3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) 
     END 
    ) AS Rank 
FROM ContribContent 
INNER JOIN Users ON ContribContent.UserID = Users.UserID 
ORDER BY Rank DESC 

每个这些插入我建议做一个PRINT或@Content的SELECT之后。这将告诉您在调试过程的每个阶段之后数据是如何留下的。有时,如果您正在执行INNER JOIN的表格不正确(即空值或缺失值),则不会返回预期的数据。此外,每当处理可能的空值时,我喜欢输出各种测试数据及其结果,以确保它们正在按照我的意图进行操作(例如,CASE结构)。