2013-01-09 4 views
0

[key]은 고유해야하며 문에서 MAX 호출은 한 번만 호출 된 것으로 간주되므로 다음 T-SQL 문은 작동하지 않습니다. 즉, 키 값을 한 번만 증가시키고 그 값을 반복해서 삽입하려고합니다. 누구든지 해결책이 있습니까?고유 키가있는 INSERT + SELECT

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')) 
+0

키는 시드 된 ID 일 수 있습니까? 그렇다면 자동으로 증가하므로 키 필드를 삽입 할 필요가 없습니다. –

+3

왜 'IDENTITY'를 사용하지 않습니까? 이것은 당신의 문제를 해결할 것입니다. – Taryn

+0

아마도 조건 : WHERE [email]! = ''AND [active] = '1'은 그것을 망칠 것입니다. 그것은 정말로 테이블의 최대 값을 반환하지 않습니다. 최대 값은 어디까지입니까? –

답변

1

키 열을 아마도 가장 쉬운 IDENTITY 열로 만들 수 있다면. 이를 통해 SQL Server는 증분 값을 생성 할 수 있습니다.

키를 생성하는 고유 한 방법을 찾는 것이 확실하다면 지난 달에 쓴 블로그 게시물이 도움이 될 수 있습니다. 복합 키를 사용하지만 단일 INSERT 문에 여러 행을 삽입하여 문제를 방지하기 위해 수행해야하는 작업을 보여 주며 각 행에 대해 새 값을 안전하게 생성하며 여러 동시 작성자간에 안전합니다. 부수적으로) 당신은 당신의 선택의 각 행에) (키 MAX에 대해 동일한 값을 얻을 이유를

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

거래를하지 않는이 테이블에서 읽을 때 발생하는 것입니다. 따라서 SELECT 문이 반환하는 모든 행에 대해 MAX (키)는 항상 동일합니다. SELECT 문에 일종의 GROUP BY 절을 추가하지 않으면 모든 MAX (columnName) 함수는 반환 된 각 행에 대해 동일한 값을 반환합니다.

또한 모든 집계 함수는 결정적이므로 각 입력 집합에 대해 항상 동일한 출력을 갖습니다. 따라서 키 세트가 1, 5, 9이면 항상 9를 반환합니다.