【发布时间】: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 时,有没有办法生成唯一值?
【问题讨论】:
-
看看列类型
TIMESTAMP:technet.microsoft.com/en-us/library/aa260631(v=sql.80).aspx -
如果您需要为每一行生成唯一值 - 您可以通过
newid()使用 GUID -
您可以先将其插入以 Invoice 作为 IDENTITY() 列的临时表,然后从临时表插入到 Table1。
-
Please don't use
varcharwithout length 请不要将日期/时间数据作为唯一键的一部分。 -
另外,don't use cryptic shorthand like
ns。您写NANOSECOND需要多长时间?大约 15 纳秒?去做吧,让你的代码自我记录,而不是maximizing productivity through shorthand。
标签: sql sql-server select sysdatetime