DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SQL文のSqlParameterでテーブル名を指定する

環境/言語:[.NET Framework 3.5, SQL Server 2008 R2]
分類:[ASP.NET]

こんにちは。

例えば、以下のようなSQL文を投げるとします。
SELECT * FROM tblMyTable WHERE col1 = N'value'

ここで、tblMyTableとN'value'をパラメータ化したいので、以下のように変更します。
SELECT * FROM @table WHERE col1 = @col1value

後は、パラメータをSqlParameterで設定するだけで良いのですが、@tableのSqlDbTypeが分かりません。
@col1valueはSqlDbType.NVarCharで良いのですが。。

お力添え、お願いします。
■No30184に返信(むくさんの記事)
> SELECT * FROM @table WHERE col1 = @col1value

テーブル名が不明だと、問い合わせに対する実行計画を立てられないため、
テーブル名をパラメータ化することはできません。
(これは SQL Server に限った話ではなく、ほかの多くのDBにも当てはまります)

この場合は、動的に SQL 文字列を組み立てて実行させる必要があります。

たとえば、ASP.NET プログラム側から渡すのであれば
 sql = String.Format("SELECT * FROM {0} WHERE col1 = @col1value", tableName)
と書けますし、SQL 側で処理するのであれば、
 set sql = 'select * from ' + @tableName + ' where …
 execute ( sql )
などとします。
お返事ありがとうございます。

そうなんですね。ありがとうございます。

インジェクション対策としてパラメータ化したかったのですが、難しいのであれば、正規表現でチェックしたのち、提示の方法を使用したいと思います。


■No30185に返信(魔界の仮面弁士さんの記事)
> ■No30184に返信(むくさんの記事)
>>SELECT * FROM @table WHERE col1 = @col1value
>
> テーブル名が不明だと、問い合わせに対する実行計画を立てられないため、
> テーブル名をパラメータ化することはできません。
> (これは SQL Server に限った話ではなく、ほかの多くのDBにも当てはまります)
>
> この場合は、動的に SQL 文字列を組み立てて実行させる必要があります。
>
> たとえば、ASP.NET プログラム側から渡すのであれば
>  sql = String.Format("SELECT * FROM {0} WHERE col1 = @col1value", tableName)
> と書けますし、SQL 側で処理するのであれば、
>  set sql = 'select * from ' + @tableName + ' where …
>  execute ( sql )
> などとします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板