通过循环在sql server中输入40000行

时间:2013-05-14 17:15:24

标签: sql-server database tsql loops random

我必须创建一个完全基于SQL Server的数据库系统。这是一个诊断实验室。它应包含至少40,000个不同的患者记录。我有一个名为“患者”的表,其中包含自动生成的ID,姓名,DOB,年龄和电话号码。我们的老师为我们提供了一个虚拟存储过程,其中包含2个临时表,每个表有200个名称,最后他制作了一个Cartesian产品,该产品应该提供40,000个不同的行。我使用了相同的虚拟存储过程并根据我们的表进行了修改。但插入的行每次只有1260行。每次我们运行查询时,它都不会给我们超过1260条记录。我添加了一部分临时名称表和存储过程。

Declare  @tFirstNames Table( FirstName Varchar(50) Not Null )
Declare @tLastNames Table ( LastName Varchar(50) Not Null )
Declare @tNames Table ( Id Int Identity Not Null, Name Varchar(50) Not Null)
Insert Into @tFirstNames (FirstName)
    Select 'Julianne' Union All Select 'Sharyl' Union All Select 'Yoshie'
    Union All Select 'Germaine' Union All Select 'Ja' Union All
    Select 'Kandis' Select 'Hannelore' Union All Select 'Laquanda' Union All
    Select 'Clayton' Union All Select 'Ollie' Union All
    Select 'Rosa' Union All Select 'Deloras' Union All
    Select 'April' Union All Select 'Garrett' Union All
    Select 'Mariette' Union All Select 'Carline' Union All


Insert Into @tLastNames (LastName)
    Select 'Brown' Union All Select 'Chrichton' Union All Select 'Bush'
    Union All Select 'Clinton' Union All Select 'Blair'
    Union All Select 'Wayne' Union All Select 'Hanks'
    Union All Select 'Cruise' Union All Select 'Campbell'
    Union All Select 'Turow' Union All Select 'Tracey' 
    Union All Select 'Arnold' Union All Select 'Derick' 
    Union All Select 'Nathanael' Union All Select 'Buddy' 

Insert Into @tNames
Select  FirstName + ' ' + LastName
    From @tFirstNames, @tLastNames

Declare @iIndex Integer
Declare @iPatientTotalRecords Integer
Declare @vcName Varchar(50)
Declare @iAge Integer
--Set @iIndex = 1
Select @iPatientTotalRecords = Max(Id), @iIndex = Min(Id) From @tNames

While @iIndex <= @iPatientTotalRecords
Begin

    Select @vcName = Name From @tNames Where Id = @iIndex
    Set @iAge = Cast( Rand() * 70 As Integer ) + 10
    Insert into Patient values
        (@vcName, @iAge,
            Case Cast( Rand() * 3  As Integer)
            When 0 Then 'Male'
            When 1 Then 'Female'
            Else 'Female'
            End,
            Cast( Rand() * 8888889 As Integer ) + 1111111, DateAdd ( year, -@iAge, GetDate()))

    Set @iIndex = @iIndex + 1
End

1 个答案:

答案 0 :(得分:4)

可能你错过了UNION ALL -

Select 'Julianne' Union All 
Select 'Sharyl' Union All 
Select 'Yoshie' Union All 
Select 'Germaine' Union All 
Select 'Ja' Union All
Select 'Kandis' --<-- missing union all
Select 'Hannelore' Union All 
Select 'Laquanda' Union All
Select 'Clayton' Union All 
Select 'Ollie' Union All
Select 'Rosa' Union All 
Select 'Deloras' Union All
Select 'April' Union All 
Select 'Garrett' Union All
Select 'Mariette' Union All 
Select 'Carline'

试试这个(没有WHILE和其他变量):

DECLARE @tFirstNames TABLE (FirstName VARCHAR(50) NOT NULL)
INSERT INTO @tFirstNames (FirstName)
VALUES 
    ('Julianne'), ('Sharyl'), ('Yoshie'), ('Germaine'), 
    ('Ja'), ('Kandis'), ('Hannelore'), ('Laquanda'), ('Clayton'), 
    ('Ollie'), ('Rosa'), ('Deloras'), ('April'), ('Garrett'), 
    ('Mariette'), ('Carline')

DECLARE @tLastNames TABLE (LastName VARCHAR(50) NOT NULL)
INSERT INTO @tLastNames (LastName)
VALUES 
    ('Brown'), ('Chrichton'), ('Bush'), ('Clinton'), 
    ('Blair'), ('Wayne'), ('Hanks'), ('Cruise'), ('Campbell'), 
    ('Turow'), ('Tracey'), ('Arnold'), ('Derick'), 
    ('Nathanael'), ('Buddy') 

INSERT INTO dbo.Patient (...) 
SELECT 
      -- Possible problem: String or binary data would be truncated 
      d.FLName -- <-- FirstName + LastName i.e. 50 + 1 + 50 = 101 chars
    , d.Age
    , Gender = CASE ABS(CAST((BINARY_CHECKSUM(NEWID(), NEWID())) AS INT)) % 3
                    WHEN 0 THEN 'Male'
                    ELSE 'Female'
               END
    , (ABS(CAST((BINARY_CHECKSUM(NEWID(), NEWID())) AS INT)) % 8888889) + 1111111
    , BirthDay = CONVERT(VARCHAR(10), DATEADD( year, -d.Age, GETDATE()), 112)
FROM (
    SELECT 
          FLName = f.FirstName + ' ' + l.LastName
        , Age = (ABS(CAST((BINARY_CHECKSUM(f.FirstName, NEWID())) AS INT)) % 70) + 10
    FROM @tFirstNames f
    CROSS JOIN @tLastNames l
) d
相关问题