【问题标题】:Date in SELECT statement is always the sameSELECT 语句中的日期始终相同
【发布时间】:2014-09-23 14:39:30
【问题描述】:

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

【问题讨论】:

标签: sql sql-server select sysdatetime


【解决方案1】:

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; 

【讨论】:

    【解决方案2】:

    我不确定您是否需要绑定到毫秒,或者同一行中的值是否需要相同,但可以使用以下方法来获得唯一性:

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

    或者

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-24
      • 2014-03-07
      • 2014-11-29
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多