2017-01-05 10 views
-1

私はSQL UpdateクエリとC#のDataTableを持っています。このDataTableをSQL ServerのTempTableとして使用したかったのです。クエリ)SQL Serverの一時テーブルとしてdatatableを使用するにはどうすればよいですか?

1 below- C#コードを確認してください(ADO.NETにより)C位側に

を実行するC#データテーブル:

using (var cmd = cn.CreateCommand()) 
{ 

    cmd.CommandText = "UPDATE p 
        SET p.Name = t.Name, p.Type = t.Type 
        FROM Product AS p 
        INNER JOIN dt AS t ON p.id = t.id" 


cmd.ExecuteNonQuery(); 

} 

DataTable dt = new DataTable(); 

2)クエリを更新します

私のケースでは、SQLストアドプロシージャを使用することはできません。

+2

あなたは私がインラインクエリにテーブル値パラメーターを渡すことを試みたことがありませんSQL Server.' – TheGameiswar

+1

のTempTableのように、このデータテーブルを使用していた 'について詳しく説明することができます。私には不可能な気持ちがあります。 –

+0

あなたのSQLサーバはあなたのローカル変数を見ることができません、あなたは逆を行うことができますし、linqにSQLを使用し、ローカルテーブルを使用して...労働力を分割するので... – BugFinder

答えて

1
foreach(DataRow dr in dt.Rows) 
{ 
cmd.CommandText = "UPDATE Product 
        SET Name = @name, Type = @type 
        WHERE id = @id"; 
cmd.Parameters.Clear(); 
cmd.Parameters.AddWithValue("@name", dr["Name"].ToString()); 
cmd.Parameters.AddWithValue("@type", dr["Type"].ToString()); 
cmd.Parameters.AddWithValue("@id", dr["id"].ToString()); 


cmd.ExecuteNonQuery(); 
} 

一時テーブルに一致する新しいテーブルタイプをSQL Serverで作成しない限り、SQL Serverのメモリテーブルを使用することはできません。これはオーバーヘッドです。代わりに、これにはforeachを使用できます。 dtテーブルを使用して、それぞれidを1つずつ更新することができます。動的SQLを使用して

代替方法:

cmd.CommandText = string.Empty; 
foreach(DataRow dr in dt.Rows) 
{ 
cmd.CommandText += string.Format(@"UPDATE Product 
        SET Name = '{0}', Type = '{1}' 
        WHERE id = '{2}';",dr["Name"].ToString(),dr["Type"].ToString(),dr["id"].ToString()) ; 
} 

cmd.ExecuteNonQuery(); 
+0

大きなデータには悪いアプローチです。 1000回の更新可能クエリがデータベースサーバー上で実行されるとします。 –

+0

正しいですレコードの数が多いのでループを使用できません。 SQLタイプを作成してInner Joinで使用できますか? – GreenSoft

+0

他のオプションは、複数の更新クエリを持つ動的SQLを作成することです –

0

私はこれが動作するか分からないが、私は、テーブル変数を宣言することに値を挿入して、ターゲット表を更新しようと思い付きました、インラインクエリ内のすべて:

var sb = new StringBuilder("DECLARE @T as Table (Id int, Name varchar(20), Type int); "); 

sb.Append("INSERT INTO @T VALUES "); 
foreach (DataRow row in dt.Rows) 
{ 
    sb.Append("(").Append(row["Id"]).Append(", '"); 
    sb.Append(row["Name"]).Append("', '"); 
    sb.Append(row["Type"]).Append("'),"); 
} 
sb.Remove(sb.Length - 1, 1); 

sb.Append(";UPDATE p "); 
sb.Append("SET p.Name = t.Name, "); 
sb.Append("p.Type = t.Type "); 
sb.Append("FROM Product AS p "); 
sb.Append("INNER JOIN @T AS t ON p.id = t.id"); 

var query = sb.ToString(); 
+0

#Zohar、私はここでループを使用したくありません。レコードの数大きいです。我々はループなしでそれを行うことができる方法を提案してください。 – GreenSoft

+0

ループはC#のみであり、それを埋めるのに時間がかかりません。なぜストアドプロシージャを使用できないのですか? –

+0

実際に私たちはSQLite db(SQLiteファイル)のテーブルの一つを更新しているためです。 Googleではモバイルアプリ/デバイス(モバイルアプリケーション:Android/IOS)に送信します。 – GreenSoft

関連する問題