TSQL объединяет неправильный синтаксис рядом с ‘,’

#c# #sql-server-2008 #tsql

#c# #sql-server-2008 #tsql

Вопрос:

Получая SQLException с этим «супер полезным» сообщением об исключении (неправильный синтаксис рядом с ‘,’.), Было интересно, может ли кто-нибудь увидеть что-то неправильное в синтаксисе на первый взгляд?

Это код, основанный на примере, который можно найти по адресу http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial /

   private void importToolStripMenuItem_Click(object sender, EventArgs e)
  {
        DataTable import = new DataTable();
        DialogResult result = this.importFileDialog.ShowDialog();
        if (DialogResult.OK == result)
        {
            Stream importStream = this.importFileDialog.OpenFile();
            import.ReadXml(importStream);
            importStream.Close();

            string tmpTable = "select top 0 * into #import from tblJob;";

            using (SqlConnection con = new SqlConnection(CONSTRING))
            {
                con.Open();

                SqlCommand cmd = new SqlCommand(tmpTable, con);
                cmd.ExecuteNonQuery();

                SqlBulkCopyOptions options = SqlBulkCopyOptions.KeepIdentity;

                using (SqlBulkCopy bulk = new SqlBulkCopy(con))
                {
                    bulk.DestinationTableName = "#import";
                    bulk.WriteToServer(import);
                }

                //http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/
                //Now use the merge command to upsert from the temp table to the production table
                string mergeSql = "merge into tblJob as Target "  
                                  "using #import as Source "  
                                  "on "  
                                  "Target.[Location]=Source.[Location],"  
                                  "Target.[Schedule]=Source.[Schedule] "  
                                  "when matched then "  
                                  "update set Target.[Complete]=Source.[Complete],"  
                                  "Target.[Cost]=Source.[Cost],"  
                                  "Target.[Description]=Source.[Description]";
                                  //"when not matched then "  
                                  //"insert (Symbol,Price,Timestamp) values (Source.Symbol,Source.Price,Source.Timestamp)"  
                                  //";";

                cmd.CommandText = mergeSql;
                cmd.ExecuteNonQuery();

                //Clean up the temp table
                cmd.CommandText = "drop table #import";
                cmd.ExecuteNonQuery();
            }
            dgvJobs.DataSource = getData("select * from tblJob");
 

Ответ №1:

Если вы хотите иметь несколько критериев объединения в вашем MERGE , вам нужно использовать AND ключевое слово (а не запятую , , как вы используете сейчас).

Вместо

 merge into tblJob as Target 
using #import as Source on Target.[Location]=Source.[Location], Target.[Schedule]=Source.[Schedule] 
 

который вы используете, используйте это вместо:

 MERGE INTO dbo.tblJob AS Target 
USING #import AS Source ON Target.[Location] = Source.[Location]
                           AND Target.[Schedule] = Source.[Schedule] 
 

Это верно для любого условия соединения, а также для INNER JOIN и LEFT OUTER JOIN или любого другого типа соединения.