2011-11-14 13 views
2

ASP.NETページで使用されるストアドプロシージャを変更しようとしています。T-SQL:ASP.NET GridViewで選択した列による動的クエリ

デフォルトでは、ストアドプロシージャはすべてのデータを返しますが、プラント内の従業員にとっては圧倒的な可能性があります。

私は従業員が彼らの特定の項目のデータを検索できるように列名のメニュー項目と値のテキストボックスダウンドロップを追加します。

私は追加したいことは、次のように検索する列名と列値で渡す機能、次のとおりです。すべての値が(@colValue@colName)に渡された場合

DECLARE @colName nVarChar(50), @colValue nVarChar(50) 
SET @colName='EmployeeID' 
SET @colValue='007135' 
SELECT Column1, Column2, Column3, Column4, Column5, Column6, Column7 
FROM viewNum1 
WHERE ((@colName IS NULL) OR (@colValue IS NULL) OR ('['[email protected]+']'[email protected])) 

、すべてのレコード戻る;しかし、@colName = EmployeeID@colValue = '007135'(データベースに存在する値)を指定しようとすると、レコードは返されません。

次に、ストアドプロシージャがテーブルの列名にアクセスすることを許可しない古いSQL Server 2000データベースを実行していて、技術全体がSQLインジェクションを受けやすいように見えるという問題があります。

最後に、私のGridViewコントロールをこれにバインドする方法がわかりませんし、まだすべてのレコードを表示する能力があります。

このようなフィルタリングストアドプロシージャを作成するにはどうすればよいですか?

答えて

3

重要なデータベースでこれを行うことをお勧めしません。それはあなたのデータの簡単な攻撃にあなたを開きますが、あなたはあなたのためのトリックを行います下に尋ねたので、通り:

DECLARE @colName nVarChar(50) = NULL; 
DECLARE @colValue nVarChar(50) = NULL; 

DECLARE @sql = 'SELECT Column1,Column2,Column3,Column4,Column5,Column6,Column7 FROM viewNum1 WHERE 1=1 '; 

if ISNULL(@colName,'')<>'' AND ISNULL(@colValue,'')<>'' 
    SET @sql = @sql + ' AND ' + @colName + '=''' + @colValue + ''''; 


exec(@sql); 

私が推薦する、それがより安全であるとして、あなたは代わりに各列のNULL可能なパラメータとPROCを作成します。

CREATE PROCEDURE dbo.ProcName 
    @Column1 as nvarchar(50) = NULL, 
    @Column[n] as [dbtype] = NULL 
AS 
BEGIN 

SELECT Column1, Column[n]... 
FROM viewNum1 
WHERE 
((@Column1 IS NULL) OR (Column1 = @Column1)) 
AND ((@Column[n] IS NULL) OR (Column[n] = @Column[n]))... 

END 

GO 
1

パラメータとして列名を渡す場合は、SQL文字列全体(dynamic sql)を生成する必要があります。

そして、exec(SQL_STATEMENT)を使用してSQL文を実行します。私はこれを行うことはお勧めしません。ここにdbforumの例があります:http://www.dbforums.com/microsoft-sql-server/969925-passing-table-column-name-parameter-stored-procedure.html

また、この部分はあまり意味がありません@colValue IS NULL。私がこれを正しく読んでいるのであれば、値がNULLであるかどうかはわかりません。

+0

私は2つの矛盾する答えを持っています。ジャスティンのストアドプロシージャは '@colValue IS NULL'を使用しますが、それは動作しないと言っています。私は誰にも反論していない。私は、誰が正しいのかを知るのに十分なほどSQLをよく知りません。あなたはここにもっと多くの担当者を持っているので、私はあなたに尋ねた。 – jp2code

+1

@ jp2code - ポイントは関係ありません - 私はちょうど助けに来ました。このように考えてみましょう。もしあなたがこのようなコードを書いたら 'SELECT ... FROM..WHERE 123 IS NULL'は意味がありますか? nullに値を代入しようとしていますか?あなたは 'VALUE IS NULL'ではなく' Column IS NULL'と言うでしょう。ところで、彼はwhereステートメントでそれを使用しないjustinsストアドプロシージャを見ています。私の助言は、彼がWHEREとAND/ORのようなブール式を使ったようにあなたのsprocを書くことですが、colval IS NULL部分は使わないでください。 – JonH

+1

ところで、彼らは矛盾した答えは間違いありません、私たちは彼があなたにサンプルコードを与えているのと同じ答えを与えています。 – JonH

関連する問題