2011-08-07 100 views
17

我來從MySQL到SQL Server。 SQL Server中以下語法不工作嗎?INSERT INTO SET語法在SQL Server

INSERT INTO table SET fil1="234", fil2="324" 

SQL Server中是否有類似的語句?

+5

多麼混亂的語法!如果我不知道如何使用網絡搜索來查找[文件](http://dev.mysql.com/doc/refman/5.5/en/insert.html),我還以爲有人混淆了UPDATE和INSERT! –

+0

這兩個答案都很有用,謝謝! –

+13

我實際上討厭當前的SQL語法。用小表工作似乎很好,但是當表開始有很多列時,使用Col = value語法更好。 – Rhyous

回答

8

SET插入記錄的方式不是standard SQL。如果你需要使用類似SQL的更新和插入,你應該在MS SQL-Server中使用存儲,過程代替,例如:

CREATE Procedure tableInsertUpdate 
(
    @ID int, 
    @fil1 int, 
    @fil2 int, 
    @IDOut int OUTPUT 
) 
AS 
    IF EXISTS(SELECT ID from table WHERE [email protected]) 
    BEGIN 
     UPDATE table SET 
      fil1 = @fil1 
      fil2 = @fil2 
     WHERE [email protected] 
     SET @IDOut=null 
     END 
     ELSE 
     BEGIN 
     INSERT INTO table 
     (fil1, fil2) 
     VALUES 
     (@fil1, @fil2) 
     SET @IDOut=scope_identity() 
     END 
+1

這不是線程安全的。您可以通過使存在檢查可序列化或通過重試重複鍵錯誤來修復它。最後一個選項是首選,因爲使其可序列化遲早會產生死鎖。 –

+0

您可能還想查看聯機叢書中的MERGE說明。 – HLGEM

16
INSERT INTO table (fil1, fil2) VALUES ('234', '324');
+3

插入只有這種語法? (很差) –

+4

不一定是壞事。由於它不是SQL標準。 –

+0

@KakYlia,它是6比1,其他6比1。如果您沒有爲所有字段插入數據,它們都要求您明確聲明您的字段。 – 2011-08-07 16:12:05

8

這只是有一個獨特的INSERT和UPDATE語句一個大麻煩。如果您必須處理包含30列的表格,您將很容易理解。

MySQL的變異讓我寫代碼的一次 - 它的確需要這兩種東西 - 其實我只需要更換的查詢字符串命令的名稱。

的MSSQL變體由具有幾乎相同的代碼(關於字段名和數據的填補字段)的2倍引發錯誤。

如果我以後更改只是一個單一的字段名就意味着改變2點的位置 - 無論哪種方式,我這樣做是在MSSQL。存儲過程必須更改,並在我的代碼中調用它的插入語句。或者需要更改2個不同的插入和更新語句。這個明顯的錯誤來源完全被歸咎於MSSQL上(至少從我的角度來看)。