这是场景。我有一个本地 SQL Server,我已将实时 SQL Server 数据库恢复到该本地 SQL Server。为了符合 GDPR/CCPA,我必须匿名化本地服务器数据库中的 PII。我有一个脚本来执行此操作,当本地服务器是 2008 R2 或 2017 时,它一直运行良好。但我刚刚安装了 2019,并且相同的脚本在表的每一行中放置了相同的值,而不是不同的值对于每一行。就好像函数只执行一次,然后在UPDATE
语句中使用该值。也许这是 2019 年正在做的某种优化?这是脚本的一个片段。
UPDATE Guest SET GuestFirstName=Utility.dbo.RANDWORD() WHERE GuestFirstName IS NOT NULL;
RANDWORD
从包含大约 100,000 个英语单词的表中抓取一个随机单词。
我怀疑这是因为 SQL 2019 的一个新功能,标量 UDF 内联:
这可能会带来性能优势,但在您的情况下,它似乎只处理该函数一次,然后将相同的结果应用于每一行。
链接文章的底部描述了禁用标量 UDF 内联的几种方法。
您可以按数据库禁用它:
或者使用提示强制此选项逐个查询:
或者您可以通过更改 UDF 本身来禁用它: