@DavidSpillett:仅供参考,您可以通过从视图中读取来绕过 newid() 的禁令: CREATE VIEW vw_NewGuid AS SELECT NEWID() AS new_guid 。然后在您的 UDF 中,您可以执行以下操作: SELECT new_guid FROM vw_NewGuid
注意@david-spillett 的警告:
@Dio:我会非常警惕涉及欺骗引擎的解决方法,即某些东西是确定性的,而实际上并非如此。您正在使用可能会在以后修复的错误(也许它应该检测到视图中的列不是确定性的,他们将在 SQL Sever {Nextversion} 中修复它)或依赖于类似不是的“未定义行为”保证在以后的版本中工作相同(如果查询中的其他情况发生变化,甚至在您当前的版本中)。
SQL Server 只允许在用户定义的函数中使用确定性函数。由于 NEWID() 的值不是确定性的,因此不能使用。您会发现 GETDATE() 和任何其他非确定性函数也是如此。
我没有资格回答他们为什么会做出这个决定。这也让我很恼火,但我确信 MS 的 SQL 团队不会无精打采。
编辑:事实证明,我对 GETDATE() 的了解已经过时了。正如评论者所说,您可以在 SQL Server 2005 以后的函数中使用 GETDATE() 。但是,您仍然不能使用 NEWID(),我认为这与相同的非确定性约束有关。
微软的 NEWID() 文档没有解释,但我同意可能的原因与@Payload 对另一个答案的评论有关:
对于那些愿意冒险的人,请参阅@dio-phung 在同一答案的另一条评论中建议的解决方法:
注意@david-spillett 的警告:
该解决方法/技巧在其他几个 答案中提供。
我相信答案是 NEWID() 是一个非确定性函数——即它有副作用。用户定义的函数不允许有副作用。