0

次の T-SQL ステートメントは[key]、一意であるMAX必要があり、ステートメント内の呼び出しがSELECT1 回しか呼び出されないように見えるため、機能しません。言い換えれば、キー値を 1 回だけインクリメントし、その値を何度も挿入しようとしています。誰にも解決策がありますか?

INSERT INTO [searchOC].[dbo].[searchTable]
([key],
 dataVaultType,
 dataVaultKey,
 searchTerm)
SELECT (SELECT MAX([key]) + 1 FROM [searchOC].[dbo].[searchTable]) AS [key]
  ,'PERSON' as dataVaultType
  ,[student_id] as dataVaultKey
  ,[email] as searchTerm
FROM [JACOB].[myoc4Data].[dbo].[users]
WHERE [email] != '' AND [active] = '1'
AND [student_id] IN (SELECT [userID] FROM [JACOB].[myoc4Data].[dbo].[userRoles] 
WHERE ([role] = 'STUDENT' OR [role] = 'FACUTLY' OR [role] = 'STAFF'))
4

1 に答える 1

1

キー列を IDENTITY 列にすることができれば、おそらく最も簡単です。これにより、SQL Server は増分値を生成できます。

または、キーを生成する独自の方法を見つけることに自信がある場合は、先月書いたブログ記事が役立つかもしれません。複合キーを使用していますが、単一の INSERT ステートメントに複数の行を挿入して新しい行ごとに新しい値を安全に生成するという問題を解決するために何をする必要があるかを示しています。取り扱わない)

http://colinmackay.co.uk/2012/12/29/composite-primary-keys-include-identity-like-column/

ちなみに、SELECT の各行で MAX(Key) に同じ値を取得する理由は、これがテーブルの読み取り時に発生するためです。したがって、SELECT ステートメントが返すすべての行について、MAX(key) は常に同じになります。SELECT ステートメントに何らかの GROUP BY 句を追加しない限り、MAX(columnName) 関数は、返される各行に対して同じ値を返します。

また、すべての集計関数は決定論的であるため、同等の入力セットごとに常に同じ出力が得られます。したがって、キーのセットが 1、5、9 の場合、常に 9 が返されます。

于 2013-01-09T22:53:16.103 に答える