为什么我不能在用户定义的表值函数中使用 newid()?

gor*_*ric 5 sql-server-2005

我最近发现 SQL Server 2005 不允许newid()在用户定义的函数中使用。为什么是这样?

我有一个适合我需求的替代解决方案,所以我不是在寻找解决这个问题的方法。我很好奇为什么设计师会做出这个决定。

Joh*_*soe 5

SQL Server 只允许在用户定义的函数中使用确定性函数。由于 NEWID() 的值不是确定性的,因此无法使用。您会发现 GETDATE() 和任何其他非确定性函数也是如此。

我没有资格回答他们为什么会做出这个决定。这也让我很恼火,但我确信 MS 的 SQL 团队不会懈怠。

编辑:事实证明,我对 GETDATE() 的了解已过时。正如评论者所说,您可以在 SQL Server 2005 以后的函数中使用 GETDATE()。但是,您仍然不能使用 NEWID(),我认为这与相同的非确定性约束有关。

  • 我相信这取决于查询规划器是否需要一些东西才能可靠地重复。在某些情况下,在存在非确定性函数的情况下,QP 使用的一些优化不是“安全的”(即可能导致不一致或只是简单的错误输出)。据推测,拒绝 QP 这个优化选项(或让它在使用前检查每个函数)比确定性限制更像是一个问题(在效率方面)。现在允许 GETDATE,但每个查询只运行一次(因此在该查询的上下文中,它返回一个固定值)。 (3认同)