2013-05-31 5 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 이하

이 모든 테이블에 대한 create 문입니다.

주소 테이블 - 장소에서 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 ...'쿼리처럼 보입니다; 지금까지 뭐 해봤 어? 그리고 원하는 "임의"주소 유형에 대한 자세한 정보를 제공 할 수도 있습니다. 테스트 데이터를 생성하고 있습니까? AddressTypeID에 대해 1과 3 사이의 무작위 값만 원합니까? 본 [이 질문] (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 
관련 문제