2012-12-10 79 views
0

我有下面的SQL語句從存儲視圖中提取數據:搜索在SQL Server的多值儘快

foreach (var id in insert_idlist[0]) 
{ 
    mssql_con.Open(); 
    //top 1 for duplicate removal 
    //slowdown? 
    var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU = '" + id + "'"; 
} 

我想重寫SQL語句使用所有的ID插入到一個查詢IN子句或類似的語句來加速執行。但是我知道IN是一個相對較慢的操作,因此我希望能夠以最快的方式獲取有關檢索數據的專家建議。

速度是我在這個問題上唯一關心的。

請注意,安全性不是問題,因爲此應用程序正在從內部數據庫中提取所有變量,而無法直接訪問網絡。

更新代碼:

try 
    { 

     //foreach (var id in insert_idlist[0]) 
     //{ 
      mssql_con.Open(); 
      //top 1 for duplicate removal 
      //slowdown? 
      //var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU = '" + id + "'"; 
      var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU IN (" + insert_idlist .Select(x => "'" + x + "'") .Aggregate((x, y) => x + "," + y) + ")"; 
      //var mssql_select = "SELECT * FROM dbo.Book5 WHERE SKU = '"+id+"'"; 
      SqlCommand cmd = new SqlCommand(mssql_select, mssql_con); 
      cmd.CommandTimeout = 0; 
      lbl_dev.Text += "teest"; 

      //Create a data reader and Execute the command 
      try 
      { 
       SqlDataReader dataReader = cmd.ExecuteReader(); 

        //Read the data and store them in the list 
       while (dataReader.Read()) 
       { 
        insert_idlist[1].Add(dataReader["supplier name"] + " " + dataReader["range description"] + " " + dataReader["item description"]); 
        insert_idlist[3].Add(dataReader["Sale Price"] + ""); 
        insert_idlist[2].Add(dataReader["WebDesc"] + ""); 
        //insert_idlist[3].Add(dataReader["id"] + "");removed 
        insert_idlist[4].Add(dataReader["WebDimensions"] + ""); 
        insert_idlist[5].Add(dataReader["RRP"] + ""); 
        insert_idlist[6].Add(dataReader["Normal Price"] + ""); 
        insert_idlist[7].Add("482"); //add me 
        insert_idlist[8].Add(dataReader["ID"] + ""); 

        lbl_dev.Text += dataReader["supplier name"] + " " + dataReader["range description"] + " " + dataReader["item description"]; 
        lbl_dev.Text += mssql_select; 
        about_to_insert = about_to_insert + 1; 

       } 
       lbl_dyn_status.Text = "Record 0 of " + about_to_insert + "updated."; 

       dataReader.Close(); 
       mssql_con.Close(); 

      } 

      catch (Exception e) 
      { 
       lbl_dev.Text = "" + e.Message; 
      } 

    // } 


      } 
      catch (Exception e) 
      { 
       lbl_dev.Text = "" + e.Message; 
      } 

回答

0

我想改寫sql語句所有ID插入使用IN子句或similiar單 查詢。

您可以使用INSERT INTO ... SELECT ...像這樣:

INSERT INTO ATable(...) 
SELECT * FROM dbo.export_to_web WHERE SKU = someid; 

需要注意的是:你必須列出INSERT子句中的列的名字相匹配的是什麼SELECT *返回。

+0

是這是否適用?我將數據插入另一個服務器上的數據庫中,使用不同的SQL變體。 –

+0

@tracertong是的,我認爲沒關係,試試吧。 –

0

如果你是在2008或更高,做的最好的方式是值傳遞到表值參數。我總是將人們指向我寫的here的博客文章。

但是,只要您正在搜索的字段被適當地編入索引,IN不一定是一個緩慢的操作,並且它幾乎肯定會比「每個項目的連接」方法更快。

的SQL會再是這樣的:

var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU IN (" + insert_idlist 
        .Select(x => "'" + x + "'") 
        .Aggregate((x, y) => x + "," + y) + ")"; 

免責聲明 - 這LINQ可能不是100%正確的:)

+0

嘿馬特。你介意給我一些想法,爲什麼lbl_dev.text在更新的代碼中執行後是空的?乾杯! –

+0

對不起,以上評論不準確。 lbl_dev.text包含「teest」 –