create table tab3(a integer,d1 datetime default getdate())
insert into tab3(a) values(1)
insert into tab3 (a) select a from tab3
GO 20
insert into tab3 (a) select a from tab3
select d1,count(*) from tab3(NOLOCK) group by d1
最终插入肯定会花费很短的时间(在我的机器上为3秒)
但是,d1
每批中的值是不同的。即最终查询仅返回22行
2014-06-22 20:34:53.787 1
2014-06-22 20:34:56.127 1
2014-06-22 20:34:56.140 2
2014-06-22 20:34:56.153 4
2014-06-22 20:34:56.157 8
2014-06-22 20:34:56.160 16
2014-06-22 20:34:56.163 32
2014-06-22 20:34:56.167 64
2014-06-22 20:34:56.170 128
2014-06-22 20:34:56.177 256
2014-06-22 20:34:56.183 512
2014-06-22 20:34:56.193 1024
2014-06-22 20:34:56.210 2048
2014-06-22 20:34:56.240 4096
2014-06-22 20:34:56.293 8192
2014-06-22 20:34:56.397 16384
2014-06-22 20:34:56.493 32768
2014-06-22 20:34:56.607 65536
2014-06-22 20:34:56.817 131072
2014-06-22 20:34:57.240 262144
2014-06-22 20:34:57.710 524288
2014-06-22 20:35:01.630 1048576
为什么要按语句而不是按插入初始化GETDATE()?
如何确保在不使用游标的情况下,按行而不是按语句初始化默认值?
编辑:可能相关,tab3_log具有与tab3相同的架构
CREATE TRIGGER tab3_logger on tab3
AFTER INSERT
AS
BEGIN
INSERT INTO tab3_log(a) select a from inserted
END
将单个插入语句中的所有行显示为具有相同的日期时间
何时初始化默认值?
这取决于表达式是否为“运行时常量”。
为了获得所需的行为,您可以将调用包装在标量UDF中。
CREATE FUNCTION dbo.F()
RETURNS DATETIME
AS
BEGIN
RETURN GETDATE()
END
GO
CREATE TABLE T
(
A CHAR(8000) NULL,
B FLOAT DEFAULT RAND(),
C DATETIME DEFAULT GETDATE(),
D DATETIME DEFAULT dbo.F(),
E UNIQUEIDENTIFIER DEFAULT NEWID()
)
INSERT INTO T
(A)
SELECT TOP 100000 'A'
FROM master..spt_values v1,
master..spt_values v2
SELECT COUNT(DISTINCT B) AS B,
COUNT(DISTINCT C) AS C,
COUNT(DISTINCT D) AS D,
COUNT(DISTINCT E) AS E
FROM T
GO
DROP TABLE T;
DROP FUNCTION F;
返回值(例如,的确切值D
会有所不同)
+---+---+-----+--------+
| B | C | D | E |
+---+---+-----+--------+
| 1 | 1 | 823 | 100000 |
+---+---+-----+--------+
每个语句对前两个进行评估,每行对后两个进行评估。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句