我需要为高级搜索编写一个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; }
答案 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