2013-05-31 45 views
1

我需要创建一个存储过程事务,它将从两个表中提取数据并创建一个随机整数来填充第三个表(dbo.patient_address)。创建一个存储过程以从其他(多个)表列填充表

我想要以下内容,但我很难理解如何将此脚本编写为存储过程。

dbo.address AddressID = dbo.patient_address AddressID, dbo.patient PatientID = dbo.patient_address PatientID, RAND是1-3之间的整数(参见dbo.addresstype)= dbo.patient_address AddressTypeID

下面是所有这些表的创建语句。

地址表 - 30000行到位(完整的数据集)

CREATE TABLE [dbo].[ADDRESS](
    [AddressID] [int] NOT NULL, 
    [StreetAddress] [varchar](50) NULL, 
    [City] [varchar](50) NULL, 
    [State] [varchar](50) NULL, 
    [PostalCode] [varchar](50) NULL, 
CONSTRAINT [ADDRESS_PK] PRIMARY KEY CLUSTERED 
(
    [AddressID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

患者台 - 30000行到位(完整的数据集)

CREATE TABLE [dbo].[PATIENT](
    [PatientID] [int] NOT NULL, 
    [PatientFName] [varchar](50) NOT NULL, 
    [PatientLName] [varchar](50) NOT NULL, 
    [GenderID] [int] NOT NULL, 
    [DateOfBirth] [date] NOT NULL, 
CONSTRAINT [PATIENT_PK] PRIMARY KEY CLUSTERED 
(
    [PatientID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

地址类型 - 3种选择(家庭,帐单,工作) - 1至3之间的整数

CREATE TABLE [dbo].[ADDRESS_TYPE](
    [AddressTypeID] [int] NOT NULL, 
    [AddressTypeName] [varchar](10) NOT NULL, 
    [AddressTypeDescr] [varchar](10) NULL, 
CONSTRAINT [ADDRESS_TYPE_PK] PRIMARY KEY CLUSTERED 
(
    [AddressTypeID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

INSERT INTO [dbo].[ADDRESS_TYPE] 
([AddressTypeID],[AddressTypeName],[AddressTypeDescr]) 
Values ('1','Home','Home'), ('2','Bill','Billing'), ('3','Work','Work') 

这是我想要使用存储过程事务从上述所有表中填充的最终表。

CREATE TABLE [dbo].[PATIENT_ADDRESS](
    [PatientID] [int] NOT NULL, 
    [AddressID] [int] NOT NULL, 
    [AddressTypeID] [int] NULL, 
CONSTRAINT [PATIENT_ADDRESS_PK] PRIMARY KEY CLUSTERED 
(
    [PatientID] ASC, 
    [AddressID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
+1

请花时间了解存储过程和交易之间的差异。他们是两个不同的东西。存储过程可以在事务中执行,或者存储过程中可以有事务。请不要在你的问题文本中使用全部大写字母(非代码/ sql),它会在给读者大喊大叫的时候出现。 –

+0

*** SQL ***只是*结构化查询语言* - 许多数据库系统使用的语言,但不是数据库产品......许多东西都是特定于供应商的 - 所以我们真的需要知道什么**数据库系统**(和哪个版本),你正在使用(请更新标签相应).... –

+0

乍一看这看起来像一个简单的'INSERT ... SELECT ...'查询;你试过什么了?您可能想要提供更多关于您想要的“随机”地址类型的信息。您是否生成测试数据?你只需要一个介于1和3之间的AddressTypeID的随机值?你见过[这个问题](http://stackoverflow.com/questions/7878287/generate-random-int-value-from-3-to-6)? – Pondlife

回答

0

试试这个:

INSERT INTO PATIENT_ADDRESS 
SELECT PatientID, AddressID, 
    CONVERT(INT,(ABS(CHECKSUM(NEWID())/2148000000.))*3)+1 AS AddressTypeID 
FROM (
    SELECT PatientID, ROW_NUMBER() OVER (ORDER BY PatientID) AS RowNum 
    FROM dbo.PATIENT 
) x 
INNER JOIN (
    SELECT AddressID, ROW_NUMBER() OVER (ORDER BY AddressID) AS RowNum 
    FROM dbo.ADDRESS 
) y ON x.RowNum = y.RowNum 
相关问题