0

タイトル、説明、カテゴリ、作成者、言語、日付などのさまざまなフィルタに基づく事前検索用のmssqlクエリを作成する必要があります

このクエリはストアドプロシージャとして必要ですが、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インジェクションを防ぐ1つの方法は、変数をSQL-Serverに渡す前に、C#コードでSQLインジェクションを検証することです。

別の方法(または推測で最もよく使用される方法)は、「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

ストアドプロシージャ内の動的SQLクエリの良い解決策をcodeproject.comで見つけました

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

于 2013-03-11T07:57:14.060 に答える