2017-09-12 6 views
0

私の状況に適したソリューションを一日中探しています。私は非常に似ているが、私の状況では動作しないものをいくつか見つけました。私はそれらを試しました。sqlの列名のパラメータにcase文を使用where節

ここにシナリオがあります。私はテーブルベースとパーツディテールが2つあります。データグリッドビューを塗りつぶすSQLクエリのパラメータを選択するためのドロップダウンリストを持つASP Webサイト(内部のみ)があります。

私の問題はこれです。ページのドロップダウンリストボックスに基づいて、検索するために入力された条件を列名に割り当てる必要があります。ここで

は、私が定義しようとしているクエリです:(この1つは0行を返す)

sqlCmd.CommandText = ("Select ba.referenceid, ba.partnum, pd.width, pd.length, CONVERT(varchar(12), pd.dateentered, 101) As [dateentered], ba.partqty, ba.status, ba.material From tbl_dlbase ba Join tbl_partdetails pd On ba.referenceid = pd.referenceid Where Case @field1 When 'part #' Then 'ba.partnum' When 'Spacing' Then 'pd.spacing' When 'Surface' Then 'pd.surface' When 'Height' Then 'pd.height' When 'Thickness' Then 'pd.thickness' End Like '%' + @criteria1 + '%'") 

sqlCmd.Parameters.AddWithValue("@field1", ddlSc1.SelectedItem.Text) 
sqlCmd.Parameters.AddWithValue("@criteria1", txbCriteria1.Text) 

これは私が試してみましたSQL文の最新バージョンです。 ASPページのドロップダウンリストddlsc1からの選択に基づいてフィールド/カラム名を設定できる必要があります。

スタジオのマネージャーでクエリを試していて、何か指があるかもしれませんが、0行も返すので、クエリに問題があることがわかりました。

名前のパラメータを使用して列名フィールドを設定するにはどうすればよいですか。私はこれがSQLインジェクションの大きなセキュリティ上の懸念であることを知っていますが、これは社内専用のサイトであり、もっと重要なことに、私の上司は変数を使ってやりたいと言いました。

+0

私は変数に名前を使用していると考えていました。それでは、動的SQLとは何ですか? – mbcharney

+2

ここでは動的である必要はありません。現在のクエリの外観から、私はあなたが必要とするものを知っているとは思いません。 – Codexer

+0

"私は自分の状況に適した解決策を一日中探していましたが、私は非常に似ているが、私の状況ではうまくいかないものをいくつか見つけました。あなたはすでにDynamic SQLが何であるかを知っているようです(これはインターネット上の*非常に*一般的な要求です)。あなたがすでに試したことを「私の状況のた​​めに働かないでください」と教えてください。 – RBarryYoung

答えて

2

THENの値の前後に一重引用符がある以外は、実際にこの問題は発生しません。これで修正されますか?

SELECT ba.referenceid 
    ,ba.partnum 
    ,pd.width 
    ,pd.length 
    ,CONVERT(VARCHAR(12), pd.dateentered, 101) AS [dateentered] 
    ,ba.partqty 
    ,ba.STATUS 
    ,ba.material 
FROM tbl_dlbase ba 
JOIN tbl_partdetails pd ON ba.referenceid = pd.referenceid 
WHERE CASE @field1 
     WHEN 'part #' 
      THEN ba.partnum 
     WHEN 'Spacing' 
      THEN pd.spacing 
     WHEN 'Surface' 
      THEN pd.surface 
     WHEN 'Height' 
      THEN pd.height 
     WHEN 'Thickness' 
      THEN pd.thickness 
     END LIKE '%' + @criteria1 + '%'