C# select data using join to temp table
This is useful if you want to select a lot of data by key and writing IN statement is not efficient (too much data etc..). You load the keys to temp table and then select data using a join.
CREATE TABLE [dbo].[Table_1]([Id] [int] NOT NULL,[Name] [varchar](50) NULL)
[TestFixture]public class TestSelectWithTempTableJoin{[Test]public void Test(){const string nbTempCreate = @"CREATE TABLE #Ids(Id INT)";const string nbTempDrop = @"DROP TABLE #Ids";const string query = @"SELECT * FROM Table_1 tJOIN #Ids temp ON t.Id = temp.Id";var ids = new List<int>(new int[]{1,3,4});var rows = new List<KeyValuePair<int, string>>();var sqlConnectionStringBuilder = new SqlConnectionStringBuilder();sqlConnectionStringBuilder.DataSource = "(local)";sqlConnectionStringBuilder.InitialCatalog = "Tests";sqlConnectionStringBuilder.ApplicationName = "TestTempTableJoin";sqlConnectionStringBuilder.IntegratedSecurity = true;using (var conn = new SqlConnection(sqlConnectionStringBuilder.ToString())){conn.Open();var tran = conn.BeginTransaction();try{SqlCommand sqlCommand = null;//create temp tableusing (sqlCommand = new SqlCommand(nbTempCreate, conn, tran)){sqlCommand.ExecuteNonQuery();}//load datavar dt = new DataTable();dt.Columns.Add("Id", typeof(int));foreach (int id in ids){var row = dt.NewRow();row["Id"] = id;dt.Rows.Add(row);}using (SqlBulkCopy bcp = new SqlBulkCopy(conn,new SqlBulkCopyOptions(), tran)){bcp.DestinationTableName = "#Ids";bcp.BulkCopyTimeout = 30;bcp.BatchSize = 10;bcp.WriteToServer(dt);}//execute queryusing (sqlCommand = new SqlCommand(query, conn, tran)){using (SqlDataReader reader = sqlCommand.ExecuteReader()){while (reader.Read()){rows.Add(new KeyValuePair<int, string>(reader.GetInt32(0), reader.GetString(1)));}}}//remove temp tableusing (sqlCommand = new SqlCommand(nbTempDrop, conn, tran)){sqlCommand.ExecuteNonQuery();}tran.Commit();}catch (Exception){tran.Rollback();}finally{conn.Close();}}Console.WriteLine("Found {0} rows", rows.Count);foreach (var row in rows){Console.WriteLine("{0},{1}",row.Key,row.Value);}}}
Comments
Post a Comment