1

だから私はと呼ばれるコンピュータ名を含む配列を持っていますhostnames[]

含まれています:compname1, compname2, compname3など。

実際には、別のSQLクエリからメンバーを取得します。

データテーブルがあり、hostname列に配列内のコンピューター名のいずれかが含まれているすべての行をクエリする必要があります。

何かのようなもの:

select * from table where hostname in hostnames[]

目標を達成するにはどうすればよいですか?

編集:私は以下について考えていました:

string temp = "'" + hostnames[0] + "'";
for(int i=1; i<hostnames[].Lenght; i++)
{
temp = temp + ",'" + hostnames[i] + "'";
}
string query = "SELECT * FROM table WHERE hostname IN (" + temp + ")";
4

2 に答える 2

2

IN句のパラメータを使用する最良の方法は、テーブル値のパラメータを使用することです。この場合、1つのnvarchar列を持つテーブルとしての型が必要になります。混乱することなくタイプを再利用できるように、一般的な名前を使用しました。

CREATE TYPE dbo.StringList AS TABLE (value NVARCHAR(MAX));

次に、値をDataTableに追加し、これをパラメーターとしてselectコマンドに渡す場合です。

var dataTable = new DataTable();
dataTable.Columns.Add(new DataColumn("Value", typeof(string)));

for (int i = 0; i < hostnames.Length; i++)
{
    var dr = dataTable.NewRow();
    dr[0] = "";
    dataTable.Rows.Add(dr);
}
using (var connection = new SqlConnection("connectionString"))
using (var command = new SqlCommand("SELECT * FROM Table WHERE HostName IN (SELECT Value FROM @StringList)", connection))
{
    SqlParameter stringListParameter = new SqlParameter("@StringList", SqlDbType.Structured);
    stringListParameter.Value = dataTable;
    stringListParameter.TypeName = "dbo.StringList";
    command.Parameters.Add(stringListParameter);

    // OPEN CONNECTION EXECUTE COMMAND ETC

}
于 2013-02-25T13:14:34.917 に答える
1

あなたが望むものを達成するための4つの方法があります。自分に最適なものを選択します。

  1. コードのようにINを使用します
  2. ORに分解します。A IN(1、2、3)=> A = 1 OR A = 2 OR A = 3
  3. テーブル値パラメーターを使用する
  4. 以前に渡されたSQLクエリを使用します。例: "SELECT * FROM table WHERE hostname IN(select hostname from tableusedEarlier)"
于 2013-02-22T19:06:10.657 に答える