SELECT语句中的日期始终相同

时间:2014-09-23 14:39:30

标签: sql sql-server select sysdatetime

我正在尝试将一个表中的数据插入到具有双列键的表中。源表不共享目标的密钥。目标中的两个键列都是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时生成唯一值?

2 个答案:

答案 0 :(得分:6)

SYSDATETIME()功能在您的查询中评估一次,因为它被视为runtime constant

您可以尝试使用窗口功能,例如ROW_NUMBER()

INSERT INTO table1 
         (invoice, 
          detailline, 
          somedata1, 
          somedata2) 
SELECT ROW_NUMBER() 
         OVER (ORDER BY actualvalue), 
       0, 
       'STARTING_VALUE_1407', 
       [actualvalue] 
FROM   table2; 

答案 1 :(得分:1)

我不确定您是否需要与毫秒相关联,或者同一行中的值是否必须相同,但以下内容可用于获取唯一:

SELECT NEWID() AS GuidNo1, 
       NEWID() AS GuidNo2 

或者

SELECT CAST(RAND() * 1000000 AS INT) AS [RandomNumber1], 
       CAST(RAND() * 1000000 AS INT) AS [RandomNumber2]