【问题标题】:Generating unique ids and transformation of unique id in TSQL在 SQL 中生成唯一 ID 和唯一 ID 转换
【发布时间】:2011-10-19 19:16:04
【问题描述】:

我正在尝试通过创建两个新列值来更新 SQL 表:一个唯一 ID,然后是刚刚创建的唯一 ID 的缩短整数版本

使用我发现的技巧here(请参阅底部的“NEWID() 方式”),这就是我认为可行的方法:

Update Customer Set [UniqueId] = NEWID(), [UniqueIntegerId] = ABS(CAST(CAST([UniqueId] AS VARBINARY) AS INT))

但这会产生类似

[UniqueId] [UniqueIntegerId]

3C79...5A4DEB2 754988032

1FD6...828B943 754988032

1F48...E80F511 754988032

尝试完成此操作的正确语法是什么?

【问题讨论】:

  • 我只在使用NEWSEQUENTIALID 而不是NEWID 时看到重复,您使用的是什么版本的 SQL Server?我想这是 MAC 地址的常量位?
  • 版本是 Microsoft SQL Server 2008 (SP1)。
  • 虽然实际上我的测试是在insert 上而不是更新。很确定您的更新将在 [UniqueId] 列的“之前”版本上运行,而不是“之后”版本。
  • @MartinSmith:确实会,正如this article 所证实的那样。

标签: tsql syntax uniqueidentifier


【解决方案1】:

这不会按预期工作,因为表达式中的[UniqueId] 在更新之前被评估为一个值。您可以尝试以下方法:

DECLARE @uid uniqueidentifier;
UPDATE Customer
SET
  @uid = [UniqueId] = NEWID(),
  [UniqueIntegerId] = ABS(CAST(CAST(@uid AS VARBINARY) AS INT))

@uid 变量被赋予与[UniqueId] 相同的值,然后在另一列的表达式中代替[UniqueId]

【讨论】:

  • 我认为您不能在这里依赖从左到右的评估。似乎类似于If there are multiple assignment clauses in a single SELECT statement, SQL Server does not guarantee the order of evaluation of the expressions. Note that effects are only visible if there are references among the assignments.Link
  • @Martin:感谢您的链接。我同意,它看起来确实相似。然而,我确信必须在相关文档文章中明确说明这些事情,而对于此类更新似乎没有这样做。恕我直言,这只是另一个黑暗区域,类似于古怪的更新(除非我误解了这个术语并且这个更新也有资格作为一个古怪的更新)。我的意思是,古怪更新的可靠性既没有得到官方证实,也没有得到驳斥。结果,人们在这个主题上无休止地争论正反两面,从官方资料中寻找间接证据或试图通过经验证明他们的观点。
  • (我的意思是“无休止地”,人们似乎不相信其他人的论点,所以总体上的不确定性仍然存在。)
  • 杰夫摩登大部分!在这种情况下,最好将 UniqueIntegerId 设为计算列以避免任何疑问。
  • @Martin:当我第一次读到你关于计算列的想法时,我认为这很好,但那只是一开始。现在,在重新阅读问题后,我越来越倾向于同意你的观点,这可能是最好的解决方案,所以,嗯……嗯? (也就是说,“将其作为答案发布如何?)
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2012-06-20
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多