用于高级搜索的MS SQL查询

时间:2013-03-11 06:21:24

标签: sql-server sql-server-2008 tsql

我需要为高级搜索编写一个ms sql查询,该查询基于不同的过滤器 喜欢标题,描述,类别,作者,语言和日期

我需要这个查询作为存储过程,但我不知道如果CatID = 0,WriterID = 0等我将如何构建查询。我可以使用IF Statement&在c#(ASP.Net)中轻松构建此查询。传递整个查询,但我不知道如何将其构建为T-SQL或存储过程

DECLARE @keyword nvarchar(300)
DECLARE @CatID int
DECLARE @WritterID int
DECLARE @IssueID int
DECLARE @sDate date
DECLARE @eDate date
DECLARE @LangID int
    SET @keyword = 'xyz';
    SET @CatID = 1;
    SET @WritterID = 1;
    SET @IssueID = 1;
    SET @sDate = '1/01/2012';
    SET @eDate = '1/01/2013';
    SET @LangID = 1


SELECT ArticleID,ArticleTitle,ArticleCategoryID,ArticleAuthorID,IssueID,ArticlePublishDate FROM art_Articles
    WHERE  ArticleTitle LIKE '%'+ @keyword +'%' 
    OR   ArticleDesc LIKE '%'+ @keyword +'%' 

C#中的代码示例

    strSql = "SELECT ArticleID, ArticleTitle, ArticleDesc, ArticlePublishDate FROM art_Articles WHERE ";
    strSql += "( (ArticleVisible = 1 AND ArticleActive =1 AND LanguageID =" + LangID + " ))";
        if (CatID > 0)
        { strSql += " AND  ArticleCategoryID ="+ CatID; }
        if (WriterID > 0)
        { strSql += " AND  ArticleAuthorID ="+ WriterID; }

2 个答案:

答案 0 :(得分:2)

您可以使用与C#代码相同的方式在SqlServer中构建SQL。

声明一个文本变量并使用它来将所需的SQL连接在一起。

这称为动态SQL。

然后,您可以使用“EXEC”命令执行此代码

示例:


DECLARE @SQL VARCHAR(100)
DECLARE @LangID VARCHAR(20)
DECLARE @CatID VARCHAR(20)
DECLARE @WriterID VARCHAR(20)

SET @SQL = 'SELECT ArticleID, ArticleTitle, ArticleDesc, ArticlePublishDate FROM art_Articles WHERE '

SET @SQL = @SQL + '( (ArticleVisible = 1 AND ArticleActive =1 AND LanguageID =' + @LangID

IF (@CatID > 0)
    SET @SQL = @SQL + ' AND  ArticleCategoryID =' + @CatID

IF (@WriterID > 0)
    SET @SQL = @SQL + ' AND  ArticleAuthorID ='+ @WriterID

EXEC (@SQL)

但是,使用此方法时应该注意的是一个称为“SQL注入”的安全问题。

你可以在这里阅读: http://msdn.microsoft.com/en-gb/library/ms161953(v=sql.105).aspx

防止SQL注入的一种方法是在将变量传递给SQL-Server之前在C#代码中对其进行验证。

另一种方法(或者最好用于猜想)不是使用“EXEC”命令,而是使用名为“sp_executesql”的内置存储过程。

详细信息可在此处找到:http://msdn.microsoft.com/en-gb/library/ms188001.aspx 它的使用方法详见:http://msdn.microsoft.com/en-gb/library/ms175170(v=sql.105).aspx

您必须以稍微不同的方式构建SQL并将参数传递给存储过程以及@SQL。

答案 1 :(得分:0)

我在codeproject.com上找到了很好的解决方案,用于存储过程中的动态SQL查询

http://www.codeproject.com/Articles/20815/Building-Dynamic-SQL-In-a-Stored-Procedure