サンプル目的で元の SQL を変更して使用しています。
DECLARE @list AS TABLE (Name VARCHAR(20));INSERT INTO @list(Name)VALUES ('PROCEDURE'), ('FUNCTION');SELECT *FROM INFORMATION_SCHEMA.ROUTINESWHERE ROUTINE_TYPE in (SELECT Name @list から)
プレ>テーブル値パラメータを使用できます
SQL Server 2008 (ADO. NET)
using (SqlConnection cnn =new SqlConnection("Your connection string")) { var tableParam =new DataTable("names"); tableParam.Columns.Add("名前", typeof(文字列)); tableParam.Rows.Add(新しいオブジェクト[] { "手順" }); tableParam.Rows.Add(新しいオブジェクト[] { "FUNCTION')" }); var sql =@"DECLARE @list AS TABLE (Name VARCHAR(20)) INSERT INTO @list(Name) SELECT Name from @Names; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE in (SELECT Name from @list)"; var sqlCmd =new SqlCommand(sql, cnn); var tvpParam =sqlCmd.Parameters.AddWithValue("@Names", tableParam); tvpParam.SqlDbType =SqlDbType.Structured; tvpParam.TypeName ="dbo.Names"; cnn.Open(); using(SqlDataReader rdr =sqlCmd.ExecuteReader() ) { while (rdr.Read()) Console.WriteLine(rdr["SPECIFIC_NAME"]); } }コード> プレ>
ただし、動作させる前にタイプ dbo.Names を定義する必要があります
これが型作成 SQL です
CREATE TYPE dbo.Names AS TABLE ( Name VARCHAR(Max));
プレ>もう 1 つのオプションは、XML パラメータ を使用することです。
using (SqlConnection cnn =new SqlConnection("Your connection string")){ var sql =@"DECLARE @list AS TABLE (Name VARCHAR(20)) INSERT INTO @list(Name) SELECT t.name .value('.', 'varchar(MAX)') FROM @Names.nodes('/Names/Name') as T(Name); SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE in (SELECT Name from @list)"; var sqlCmd =new SqlCommand(sql, cnn); var s =new MemoryStream(ASCIIEncoding.Default.GetBytes("
")); var xmlParam =新しい SqlXml(s); sqlCmd.Parameters.AddWithValue("@Names", xmlParam); cnn.Open(); using(SqlDataReader rdr =sqlCmd.ExecuteReader() ) { while (rdr.Read()) Console.WriteLine(rdr["SPECIFIC_NAME"]); }}コード> プレ> PROCEDURE FUNCTION