0

以下 T-SQL 语句不起作用,因为[key]它必须是唯一的,并且语句MAX中的调用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'))
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 回答