none
SQL INSERT INTO語法 改變成Access可以使用 RRS feed

  • 問題

  • public void ExeCommToDatabase(string connStr,string exeComm)//執行資料庫語法Example:Insert,delete....
    {
     OleDbConnection connect = new OleDbConnection(connStr);
     OleDbCommand olecomm = new OleDbCommand(exeComm, connect);
     connect.Open();
     olecomm.ExecuteNonQuery();
     connect.Close();
    }
    
    

     

    上面是我C#程式裡所寫的一個副函數,用來執行各種SQL指令

    其中參數:exeComm 這個是用來傳入我要執行的SQL指令

    以下是我的SQL指令
    INSERT INTO USERINFO(Badgenumber,NAME) SELECT 1234,'1234' WHERE not EXISTS (Select Badgenumber from Userinfo WHERE BADGENUMBER=1234)

    UserINFO是我用來儲存人員資料的Table

    Badgenumber是人員的編號,不可重複
    Name則是人員姓名 

    not EXISTS則是用來判斷編號有沒有重複

    後面的Select 1234,'1234'是我想要insert的值,上面整段語法作的事
    只有輸入一筆資料到UserINFO這個Table中,如果有重複的數值就不INSERT


    這段語法丟到我的ExeCommToDatabase裡面執行時

     在當我的資料庫是SQL的時候可以正常執行

    如果資料庫變成是Access,就沒有辦法正常執行了

    跳出的錯誤訊息是" 1234'

    WHERE not EXISTS (Select Badgenumber from Userinfo WHERE BADGENUMBER=1234)

    中的語法錯誤(少了運算元)"


    感覺我的指令似乎前面那段INSERT消失了 ,不知道該如何修改這段語法,才能讓SQL以及Access都能使用


    以下是我的整個project(SQL_Test)
    http://cid-651fe7a57cd7141d.office.live.com/browse.aspx/.Documents?uc=1 


    2011年6月2日 上午 08:02

解答

  • 因為自己對資料庫方面只是初學,一直以為資料庫SQL語法都是一樣的,原來還是有差異
    感謝小朱大大的提醒Jet SQL這關鍵字,總算把語法修改完成了 

     

    INSERT INTO TABLE (column1,column2....) 
    SELECT Value1,Value2... 
    WHERE not EXISTS (Select * from TABLE WHERE column1=Value)
    

     

    上面是我原本的SQL語法,不過只對MS SQL有用

    經過修改後如下

     

    INSERT INTO TABLE(column1,column2....) 
    SELECT distinct Value1,Value2.... FROM Any_TABLE
    WHERE not EXISTS (Select * from TABLE WHERE column1='Value1')
    

     

    經過修改,只是在中間Select的地方要改成Select distinct,以及後面多加上一個From

    以及最後面的WHERE地方的數值判斷要加' '
    現在也能對Access執行了,這個小小的差異讓我改了兩、三天....

    順便說明一下上面的語法,
    上面這段語法是做插入一個新資料行到資料庫中,
    如果資料行的某特定欄位已經有一樣的數值存在就不做INSERT,

    其中Any_TABLE可以隨意填入一個已存在的表格,

    Value1、Value2這些則輸入你要INSERT進去的數值

    假設上面的column1這個欄位不能有重複的數值,如果有一樣的數值存在則不INSERT
    其中的EXISTS(......) 則是用來判斷有沒有重複的數值存在  
    WHERE not EXISTS(.....) 代表不存在時則進行INSERT動作
    WHERE       EXISTS(.....) 如果將not拿掉 就變成該數值存在則進行INSERT動作 






    2011年6月3日 上午 03:18

所有回覆

  • SQL Server 可用的指令和 Access 有不小的差異,大多數在 Access 可跑的 SQL 可在 SQL Server 上跑,但反之則不一定。

    原因是 Access 的 SQL 是 Jet SQL,它不像 SQL Server 的 T-SQL 對 SQL-92 有較充份的支援,有些東西無法在 Jet SQL 上使用。

    所以你要適當的修改你的 SQL 指令,讓它可以在 Access 上執行才可以。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    2011年6月2日 上午 11:32
    版主
  • 因為自己對資料庫方面只是初學,一直以為資料庫SQL語法都是一樣的,原來還是有差異
    感謝小朱大大的提醒Jet SQL這關鍵字,總算把語法修改完成了 

     

    INSERT INTO TABLE (column1,column2....) 
    SELECT Value1,Value2... 
    WHERE not EXISTS (Select * from TABLE WHERE column1=Value)
    

     

    上面是我原本的SQL語法,不過只對MS SQL有用

    經過修改後如下

     

    INSERT INTO TABLE(column1,column2....) 
    SELECT distinct Value1,Value2.... FROM Any_TABLE
    WHERE not EXISTS (Select * from TABLE WHERE column1='Value1')
    

     

    經過修改,只是在中間Select的地方要改成Select distinct,以及後面多加上一個From

    以及最後面的WHERE地方的數值判斷要加' '
    現在也能對Access執行了,這個小小的差異讓我改了兩、三天....

    順便說明一下上面的語法,
    上面這段語法是做插入一個新資料行到資料庫中,
    如果資料行的某特定欄位已經有一樣的數值存在就不做INSERT,

    其中Any_TABLE可以隨意填入一個已存在的表格,

    Value1、Value2這些則輸入你要INSERT進去的數值

    假設上面的column1這個欄位不能有重複的數值,如果有一樣的數值存在則不INSERT
    其中的EXISTS(......) 則是用來判斷有沒有重複的數值存在  
    WHERE not EXISTS(.....) 代表不存在時則進行INSERT動作
    WHERE       EXISTS(.....) 如果將not拿掉 就變成該數值存在則進行INSERT動作 






    2011年6月3日 上午 03:18
  • 順便分享剛剛試出來的第二種寫法

    也是一樣假設column1這個欄位不能輸入重複的數值

     

    INSERT INTO Table(column1,column2....)
    select distinct Value1,Value2.... from Any_Table
    Where Value1 not in(select column1 from Table)
    

     

    這個寫法跟上面的類似

    只是後面判斷式改成的Where .... not in (....)
    後面判斷式語法的意思是:判斷Value1有沒有在後面select column1出來的資料集合裡面

    如果有再Values1有在該集合裡面,代表該數值已存在,則不進行insert 

    //剛剛稍早前發現我原本的Select Value1,Value2....這邊沒有加上distinct

    //如果沒有加上distinct,雖然在SQL上是可以執行,但是在Access上就會出錯

    2011年6月3日 上午 08:41