使用日期范围SQL自动填充表
我的问题是自动填充表。 我的表中有1000条记录,但出于测试目的,我需要插入更多数据 ID | PersonID |日期|时间|总和|类型ID |地点ID |状态ID 因此,我需要用10000条记录填充数据库,其中日期介于2015年1月3日和2015年1月5日之间,时间是随机的,总和介于100和1000之间,TypeID介于1和2之间,PlaceID介于1-10之间,StatusID介于1-3之间 如果您能给我任何帮助或建议,我将不胜感激使用日期范围SQL自动填充表,sql,sql-server,Sql,Sql Server,我的问题是自动填充表。 我的表中有1000条记录,但出于测试目的,我需要插入更多数据 ID | PersonID |日期|时间|总和|类型ID |地点ID |状态ID 因此,我需要用10000条记录填充数据库,其中日期介于2015年1月3日和2015年1月5日之间,时间是随机的,总和介于100和1000之间,TypeID介于1和2之间,PlaceID介于1-10之间,StatusID介于1-3之间 如果您能给我任何帮助或建议,我将不胜感激 提前感谢。您需要一个小的t-sql来完成这项工作: --
提前感谢。您需要一个小的t-sql来完成这项工作:
--CREATE TABLE TEST (CID INT, PERSONID INT, TEST_DATE DATE, TEST_TIME TIME, TEST_SUM INT, TYPEID INT, PLACEID INT, STATUSID INT);
--TRUNCATE TABLE TEST;
SET NOCOUNT ON;
DECLARE @X INT, @PERSONID INT, @DATE DATE, @TIME TIME, @SUM INT, @TYPEID INT, @PLACEID INT, @STATUSID INT,@R INT;
SELECT @X=0;
WHILE @X < 10000 BEGIN
SELECT @X=@X +1;
SELECT @DATE = DATEADD(DAY, @X / 4000, '2015-1-3');
SELECT @R=CONVERT(INT, RAND() * 3600 * 24);
SELECT @TIME = DATEADD(SECOND, @R , '00:00:01');
SELECT @SUM = 100 + @R % 900;
SELECT @TYPEID = @R % 2 + 1 ;
SELECT @PLACEID = @R % 10 +1 ;
SELECT @STATUSID = @R % 3 +1 ;
SELECT @PERSONID = @R % 500 +1 ;
INSERT INTO TEST (CID, PERSONID, TEST_DATE, TEST_TIME, TEST_SUM, TYPEID, PLACEID, STATUSID)
VALUES(@X, @PERSONID, @DATE, @TIME, @SUM, @TYPEID, @PLACEID, @STATUSID);
END;
SET NOCOUNT OFF;
此外,请尽量不要使用ID、日期、时间等在SQL Server中具有特殊含义的列名 一种是使用从NEWID派生的伪随机值。您没有提到应该如何分配ID和PersonID,但是如果需要增量值,可以使用CTE返回的行号值
WITH
t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
,t256 AS (SELECT 0 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d)
,t16M AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) AS num FROM t256 AS a CROSS JOIN t256 AS b CROSS JOIN t256 AS c)
SELECT
DATEADD(day, CAST(CAST(NEWID() AS varbinary(1)) AS int) % 3, '20150103') AS Date
,DATEADD(millisecond, CAST(CAST(NEWID() AS varbinary(4)) AS int), CAST('' AS time)) AS Time
,(CAST(CAST(NEWID() AS varbinary(3)) AS int) % 900) + 100 AS [Sum]
,(CAST(CAST(NEWID() AS varbinary(3)) AS int) % 2) + 1 AS TypeID
,(CAST(CAST(NEWID() AS varbinary(3)) AS int) % 10) + 1 AS PlaceID
,(CAST(CAST(NEWID() AS varbinary(3)) AS int) % 3) + 1 AS StatisID
FROM t16M
WHERE num <= 10000;
以下是一些残酷但完全随机的解决方案:
with rows as(select row_number() over(order by(select null)) as dummy from
(values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t1(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t2(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t3(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t4(n))
select *,
cast(dateadd(ms, cast(cast(newid() as varbinary(30)) as int), getdate()) as time) as time
from rows r
cross apply(select top 1 p as place
from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))p(p)
where r.dummy = r.dummy order by newid()) cap
cross apply(select top 1 s as status
from (values(1),(2),(3))s(s)
where r.dummy = r.dummy order by newid()) cas
cross apply(select top 1 t as time
from (values(1),(2))t(t)
where r.dummy = r.dummy order by newid()) cat
cross apply(select top 1 sum from(select 100 + row_number() over(order by(select null)) as sum
from (values(1),(1),(1),(1),(1),(1),(1),(1),(1))t1(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t2(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t3(n)) t
where r.dummy = r.dummy order by newid()) casu
cross apply(select top 1 dateadd(dd, s -1, '20150103') as date
from (values(1),(2),(3))s(s)
where r.dummy = r.dummy order by newid()) cad
拨弄