我正试图将一个表中的数据插入到具有两列键的表中。源表不共享目标的键。目标中的两个键列都是varchars。
我有一个插入声明:
INSERT INTO Table1 (Invoice, DetailLine, SomeData1, SomeData2)
SELECT ('1'+RIGHT('00000000000000' + CONVERT(varchar, DatePart(ns,SYSDATETIME()), 14), 0, 'STARTING_VALUE_1407', [ActualValue]
FROM Table2;
当我执行上述操作时,DateTime2对象的毫秒数都是相同的,就好像它只计算了一次该值一样。这使我无法将其用作临时唯一密钥。是否可以在SELECT语句中使用SYSDATETIME()或任何其他日期函数,并重新评估每一行的值?如果没有,在选择通常不共享目标表键的数据时执行INSERT INTO SELECT时,是否有方法生成唯一值?
SYSDATETIME()
函数在查询中求值一次,因为它被视为运行时常量。
您可以尝试窗口功能,如ROW_NUMBER()
:
INSERT INTO table1
(invoice,
detailline,
somedata1,
somedata2)
SELECT ROW_NUMBER()
OVER (ORDER BY actualvalue),
0,
'STARTING_VALUE_1407',
[actualvalue]
FROM table2;
我不确定您是否需要绑定到毫秒,或者是否需要在同一行中保持相同的值,但可以使用以下内容来获得唯一性:
SELECT NEWID() AS GuidNo1,
NEWID() AS GuidNo2
或
SELECT CAST(RAND() * 1000000 AS INT) AS [RandomNumber1],
CAST(RAND() * 1000000 AS INT) AS [RandomNumber2]