我有一个查询,我每晚都使用从几个不同的表中提取数据,这个拉取数据进入一个加载到我们云服务器的 upsert 表。我正在尝试为每一行设置某种类型的唯一标识符/主键,但我遇到了问题。
SELECT SUBSTRING(CAST(NEWID() AS varchar(38)), 1, 16)
每当我重新运行查询时,它都会更改NEWID()
每次的值,因此它每晚都会将重复项加载到我的表中,而不是更新记录。无论如何我newid()
每次运行查询时都可以保持静态值吗?
谢谢,雷切尔
我有一个查询,我每晚都使用从几个不同的表中提取数据,这个拉取数据进入一个加载到我们云服务器的 upsert 表。我正在尝试为每一行设置某种类型的唯一标识符/主键,但我遇到了问题。
SELECT SUBSTRING(CAST(NEWID() AS varchar(38)), 1, 16)
每当我重新运行查询时,它都会更改NEWID()
每次的值,因此它每晚都会将重复项加载到我的表中,而不是更新记录。无论如何我newid()
每次运行查询时都可以保持静态值吗?
谢谢,雷切尔
NEWID()
设计为返回唯一的(对您的计算机)GUID 值。每当你跑
SELECT NEWID()
您将看到不同的值。
听起来您的 UPSERT 代码需要将源表中的数据组合成一个主键,您可以在将来可靠地使用该主键来确定是否需要插入或更新给定的行。
NEWID() 每次调用时都会返回一个唯一值。它不是主键的最佳选择,大多数数据专业人员更喜欢在可能的情况下对集群主键使用 int 标识。
在您的情况下,这两种解决方案都无法完美运行,因为身份和 NEWID() 都返回新值。您需要做的是找出哪些列确定行是否重复并且需要更新而不是插入。为此,请使用合并语句。