以前の記事「【VB.NET】SQLを実行する」で、VB.NETからSQL文を実行する基本的な方法について説明しました。
プログラム中でSQLを組み立てて実行する場合、変数を使って条件等を可変にすることが多くあります。
今回は、SQL文に変数を利用し、条件等を可変にする方法について説明します。

以下、サンプル。
【データベース環境】
・データベース名:Sample
・テーブル名  :SampleTable
・SampleTableの項目
 Key01(int), Key02(char(3)), Field01(nchar(10)), Field02(numeric(18,0))
※ ()内は、データ型と桁数を示す

 SampleTableのデータは適当に入力して下さい。

【ストアドプロシージャ】
USE Sample
CREATE PROCEDURE sp_Sample
@Key1 int = 0,
@Key2 char(3) = ' '
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM SampleTable
WHERE Key01 = @Key1
AND Key02 = @Key2
END
GO

上記をクエリに貼り付けて実行すれば、ストアドプロシージャを作成します。
【VB.NET】
Public Class SPSample
Public Shared Sub Main()
Dim Con As New SqlClient.SqlConnection
Con.ConnectionString = _
"Data Source = [サーバ名];" & _
"Initial Catalog = [データベース名];" & _
"Integrated Security = SSPI"
Dim KeyValue As Integer = 1

Try
Con.Open()
Dim command As New SqlClient.SqlCommand
'コネクションの指定
command.Connection = Con
command.CommandType = CommandType.Text
'実行するSQLで@Key1という変数を利用
command.CommandText = "SELECT * FROM SampleTable WHERE Key01 = @Key1"
command.Parameters.Clear()
'SQLで利用している変数に値を設定する
command.Parameters.Add("@Key1", SqlDbType.Int).Value = KeyValue

'SQLの結果を取得する
Dim sr As SqlClient.SqlDataReader
sr = command.ExecuteReader()
command.Dispose()

'取得した結果を出力する
While sr.Read
'レコードの全項目を出力する
For cols As Integer = 0 To sr.FieldCount - 1
If cols > 0 Then
Console.Write(",")
End If
Console.Write("{0}", sr(cols).ToString)
Next
Console.Write(System.Environment.NewLine)
End While
Finally
'コネクションの破棄
If Con.State <> ConnectionState.Closed Then
Con.Close()
Con.Dispose()
End If
End Try
End Sub
End Class

VB6.0までは、SQLで変数を利用する場合には、以下のような記述をしてきました。
"SELECT * FROM SampleTable WHERE Key01 = " + KeyValue

この記述の場合、利用する変数が増えるとコードの可読性が損なわれます。
VB.NETでは、これを改善し、以下のように記述することができます。
command.CommandText = "SELECT * FROM SampleTable WHERE Key01 = @Key1"command.Parameters.Clear()
'SQLで利用している変数に値を設定する
command.Parameters.Add("@Key1", SqlDbType.Int).Value = KeyValue

Parameters.Add()メソッドでパラメータのデータ型と名前の宣言を追加します。
また、Valueプロパティでパラメータの値を設定します。
(上記のサンプルでは、パラメータの追加と値の設定を同時に行っています)
このパラメータの指定方法は、ストアドプロシージャを実行する場合にも利用しますので、記述方法の統一のためにも覚えておきましょう。

【補足事項】
・SQLで利用する変数の先頭には、「@」が必要です。
 →SQL Serverのストアドプロシージャやクエリを記述する場合も同様です。
・Parameters.Add()メソッドの第1引数はパラメータ名、第2引数はデータ型となっています。
 パラメータ名は、SQL文中の名称、データ型は、比較するデータに合わせましょう。
 (テーブルの項目値と比較する場合は、項目のデータ型に合わせて下さい)
・Parameters.Add()メソッドで指定した変数が、SQL文中に宣言されているとエラーが発生します。
 SQL文中の宣言は、"DECLARE @Key01 Int"のように記述します。
 例えば、上記のサンプルで実行するSQLが以下のようになっていた場合にエラーが発生します。
  command.CommandText = 
"DECLARE @Key01 Int" & System.Environment.NewLine &
"SELECT * FROM SampleTable WHERE Key01 = @Key1"