2017-11-16 17 views
0
INSERT INTO t_MT_User (ID, Badge, Name, Scope, comp_code, dept_code, [status]) 
VALUES ((SELECT MAX(ID) + 1 FROM t_MT_User), @userBadgeNumber, @userName, @userScope, @companyCode, @departmentCode, 1) 

このクエリは、次のエラーがスローされます。VALUESの後にサブクエリは許可されていませんか?

Subqueries are not allowed in this context. Only scalar expressions are allowed.

私はSELECTVALUESを変更する場合は、私が代わりに別のエラーを取得:

INSERT INTO t_MT_User (ID, Badge, Name, Scope, comp_code, dept_code, [status]) 
    SELECT 
     ((SELECT MAX(ID) + 1 FROM t_MT_User), 
     @userBadgeNumber, @userName, @userScope, @companyCode, 
     @departmentCode, 1) 

Incorrect syntax near ','.

どのように私は、この文脈で(SELECT MAX(ID) + 1 FROM t_MT_User)を実現します?

+0

あなたは何をしていますか?クエリーからIDの値を挿入し、その他の値をパラメータから追加しますか? –

+0

SSMS 'テーブル#t1に作成 ( ID int型、 ID1 INT )にリプロすることができない 、 (1,1)の値 #T1のに (2,2) 宣言@id INTを挿入= 1 ( (#t1以降MAX(ID)を選択します)+ 1、ID @) ' – TheGameiswar

+1

あなたはIDフィールドに自動インクリメントした後であれば、それを設定し 値 #t1の挿入、これはハックのように思えます – BugFinder

答えて

3

構文が間違っています。

+0

質問に答えている間、それはもっと重要な問題ではありません。だからこそ私の答えに正しい構文が含まれていなかったのです。なぜなら全体が最初から間違っているからです。 –

6

最初のものは最初です - あなたのコードは、構文を修正しても間違っています。 独自の自動インクリメントメカニズムを実装しようとしているようです。 これは失敗します。
正しい方法は、自動インクリメントにSQL Serverの組み込みのメカニズムを使用し、IdentityとしてID列を作成することです。

これを挿入ステートメントにまったく入れる必要はなく、マルチクライアント環境やマルチスレッド環境(現在の実装では間違った結果が出る)であっても安全です。

+0

この段階で変更することはできますか?これは、プロダクションサーバーのレコードを持つテーブルです。 – Pop

+1

はい。あなたはすべきですが、注意してください。プロダクションデータの盗難は、実際に自分のものを知っている人が行う必要があります。この 'ID'列は、外部キー制約に使用されていますか、それともビジネスデータとしての意味がありますか? –

関連する問題