2014-09-23 18 views
2

我試圖從一個表中插入數據到一個具有兩列鍵的表中。源表不共享目標的密鑰。目標中的兩個鍵列都是varchars。在SELECT語句中的日期總是相同

我有一個插入語句:

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時生成唯一值?

+0

看一看列類型'TI MESTAMP':http://technet.microsoft.com/en-us/library/aa260631(v=sql.80).aspx – 2014-09-23 14:43:04

+0

如果您需要爲每行生成唯一值 - 您可以通過newid()使用GUID, ' – 2014-09-23 14:48:13

+1

您可以首先將其插入到具有發票作爲IDENTITY()列的臨時表中,然後將臨時表插入到Table1中。 – 2014-09-23 14:48:48

回答

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

我不知道你是否有被捆綁到毫秒的要求,或者如果值必須在同一行中一樣,但下面可以用來獲得獨特:

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

或者

SELECT CAST(RAND() * 1000000 AS INT) AS [RandomNumber1], 
     CAST(RAND() * 1000000 AS INT) AS [RandomNumber2] 
相關問題