2011-08-07 10 views
17

私はSQL ServerにmySQLから来ました。次の構文はSQL Serverで機能しませんか?SQL ServerのINSERT INTO SET構文

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

SQL Serverには同等の文がありますか?

+5

どのような構文ですか? [documentation](http://dev.mysql.com/doc/refman/5.5/en/insert.html)を検索するためにWeb検索を使用する方法がわからない場合は、誰かが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

また、Books OnlineのMERGEステートメントを参照することもできます。 – HLGEM

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

Insertにはこの構文のみがありますか? (とても悪い) –

+4

必ずしも悪いことではありません。 SQL標準ではないので –

+0

@KakYlia、それは6対1、他の半ダースです。すべてのフィールドのデータをINSERTしていない場合は、明示的にフィールドの状態を記述する必要があります。 –

8

をそれは独特のINSERTとUPDATE文を持つ唯一の大きな面倒です。 30列のテーブルを扱う必要がある場合は、簡単に理解できます。

MySQLの亜種は、コードを一度書くことができます。それは両方の必要なことを行います。実際には、クエリ文字列内のコマンドの名前を置き換えるだけです。

MSSQLの亜種は、(フィールド名とフィールドに入力するデータに関して)ほぼ同じコードを2回使用することでエラーを引き起こします。

そして、後でフィールド名を1つだけ変更すると、2つのコード位置を変更することを意味します。どちらの方法でもMSSQLで行います。ストアドプロシージャを変更する必要があり、コード内でそれを呼び出すinsert文が必要です。あるいは、挿入と更新のために必要な2つの異なるステートメントを変更する必要があります。この明らかなエラーソースは、MSSQLの(少なくとも私の見地から)完全に非難されるべきです。

関連する問題