0

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

我需要将此查询作为存储过程,但我不确定如果 CatID = 0、WriterID = 0 等,我如何构建查询。我可以使用 & 传递整个查询在 c# (ASP.Net) 中轻松构建此查询IF Statement,但我不确定如何将其构建为 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; }
4

2 回答 2

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。

于 2013-03-11T11:13:48.330 回答
0

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

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

于 2013-03-11T07:57:14.060 回答