2013-01-09 31 views
0

以下T-SQL語句不起作用,因爲[key]必須是唯一的,並且SELECT語句中的MAX調用似乎只被調用一次。換句話說,它只是遞增一次鍵值,並嘗試反覆插入該值。有沒有人有辦法解決嗎?帶有唯一鍵的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

鍵可以是一個種子身份?如果是這樣,那麼你不必插入鍵字段,因爲它會自動遞增。 –

+3

爲什麼不使用'IDENTITY'?這會解決你的問題。 – Taryn

+0

也許條件:WHERE [email]!=''AND [active] ='1'將其廢棄。它不真正迴歸表的最大值,僅最大,如果where條件.. –

回答

1

如果您可以使關鍵列成爲IDENTITY列,那可能是最簡單的。這允許SQL Server生成增量值。

或者,如果你一定要找到自己的方式來生成密鑰則博客中寫道:我上個月可能有所幫助。雖然它採用的是複合鍵,會顯示您需要做的,在一個單一的INSERT語句插入多行安全產生每個新行的新值,以阻止這個問題是什麼,它也很安全在許多同時發生的作家(其中有許多例子不處理)

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

另外,您得到MAX(在您選擇的每一行都鍵)相同的值的原因是,這發生在表中讀取時間。因此,對於SELECT語句返回MAX(鍵)的所有行將始終是相同的。除非您爲任何SELECT語句添加某種GROUP BY子句,否則MAX(columnName)函數將爲返回的每一行返回相同的值。

此外,所有集合函數是確定性的,所以對於每個當量組輸入其總是具有相同的輸出。所以,如果您的鍵設置爲1,5,9則總是返回9