Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 创建存储过程以从其他(多个)表列填充表_Sql Server_Tsql_Stored Procedures_Transactions - Fatal编程技术网

Sql server 创建存储过程以从其他(多个)表列填充表

Sql server 创建存储过程以从其他(多个)表列填充表,sql-server,tsql,stored-procedures,transactions,Sql Server,Tsql,Stored Procedures,Transactions,我需要创建一个存储过程事务,它将从两个表中提取数据,并创建一个随机整数来填充第三个表(dbo.patient\u address) 我想要以下内容,但我很难理解如何将其作为存储过程编写脚本 dbo.address AddressID=dbo.patient\u address AddressID, dbo.patient PatientID=dbo.patient\u地址PatientID, RAND是1-3之间的整数(请参见dbo.addresstype)=dbo.patient\u addr

我需要创建一个存储过程事务,它将从两个表中提取数据,并创建一个随机整数来填充第三个表(
dbo.patient\u address

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

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

下面是所有这些表的create语句

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

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

地址类型-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]
试试这个:

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

请花点时间理解存储过程和事务之间的区别。它们是两种不同的东西。存储过程可以在事务中执行,也可以在存储过程中存在事务。请不要在你的问题文本(非代码/sql)中使用所有的大写字母,它给读者的印象是大喊大叫。sql只是结构化查询语言——许多数据库系统都使用这种语言,但不是数据库产品。。。许多事情都是特定于供应商的-因此我们确实需要知道您使用的是什么数据库系统(以及哪个版本)(请相应地更新标记)…乍一看,这看起来像一个简单的
插入…选择…
查询;到目前为止你试过什么?您可能想提供更多关于您想要的“随机”地址类型的信息。您正在生成测试数据吗?您是否只希望AddressTypeID的值为1到3之间的随机值?你看到了吗?
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]
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