2

我对 SQL Server 相当陌生,任何输入和建议都会有很大帮助。

我有 3 个处于一对多关系的表。

Person保存客户信息

CREATE TABLE [dbo].[Person](
[PID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](255) NULL,
[LastName] [varchar](255) NULL,
[CAddress] [varchar](255) NULL,
[Ccity] [varchar](255) NULL,
[Cstate] [varchar](2) NULL,
[Czipcode] [varchar](20) NULL,
[Ccountry] [varchar](255) NULL,
[Cphone] [varchar](25) NULL,
[Cemail] [varchar](255) NULL,
[CipAddress] [varchar](255) NULL)

Transaction持有他们的交易

CREATE TABLE [dbo].[Transaction](
[TID] [int] IDENTITY(1,1) NOT NULL,
[PID] [int] NOT NULL,
[DateOfTransaction] [date] NULL)

使用第三个表TransactionDetail,其中包含交易详细信息

CREATE TABLE [dbo].[TransactionDetail](
    [TDID] [int] IDENTITY(1,1) NOT NULL,
    [TID] [int] NULL,
    [ProductID] [int] NULL,
    [ProductName] [varchar](255) NULL,
    [ProductQTY] [int] NULL,
    [ProductPrice] [decimal](18, 2) NULL)

我想创建一个存储过程,在表中插入一次,Person然后在第三个表中插入多个详细信息。

这就是我得到的我不确定这是否正确?

CREATE TYPE dbo.TransactionTableType AS TABLE
    ( TID int, ProductID int, ProductName varchar(255), ProductQTY int, ProductPrice decimal(18,2) )
    go
CREATE PROCEDURE insertTransacion
@NewProduct dbo.TransactionTableType READONLY,
@FirstName varchar(255),
@LastName varchar(255),
@CAddress varchar(255),
@Ccity varchar(255),
@Cstate varchar(2),
@Czipcode varchar(20),
@Ccountry varchar(255),
@CPhone varchar(25),
@Cemail varchar(255),
@CipAddress varchar(255),
@DateOfTrans date
as
begin
SET NOCOUNT ON; 
DECLARE @Pid int
insert into Person(FirstName,LastName,CAddress,Ccity,Cstate,Czipcode,Ccountry,Cphone,Cemail,CipAddress) values (@FirstName,@LastName,@CAddress,@Ccity,@Cstate,@Czipcode,@Ccountry,@CPhone,@Cemail,@CipAddress)
SET @Pid = SCOPE_IDENTITY() 
insert into PTransactions(PID, DateOfTransaction) values (@Pid, @DateOfTrans)
DECLARE @Tid int
SET @Tid = SCOPE_IDENTITY()
insert into TransactionDetail(TID, ProductID, ProductName, ProductQTY, ProductPrice) Select @Tid, ntd.ProductID, ntd.ProductName, ntd.ProductQTY, ntd.ProductPrice from @NewProduct as ntd
end

不知道如何在存储过程中执行此操作我知道如何在 asp.net 中使用 ado 以编程方式执行此操作,但是我试图避免这种情况。对不起语法。

4

1 回答 1

0

简短的回答是你不能,尽管你有几个选择。

您可以创建一个 SP 来输入人员数据,并创建一个单独的 SP 来插入数据 - 一次一行。在第一次调用时返回人员 id 值,并在随后的 SP 调用中使用该值来插入数据。如果您沿着这条路走,请确保将调用代码包装在事务对象中,以便在遇到问题时可以回滚整个代码。您没有说明其余代码使用的是什么语言?

第二个选项是查看 SQL Bulk Insert 命令 - 如果您有大量数据要添加到第三个表中,这是最好的选择。但是涉及首先将该数据写入文件 - 轻微的痛苦,但它非常快。如果您要添加数千行或更多行,那就太好了。

根据您的开发语言,还有其他几个选项。

干杯西蒙

于 2013-01-23T10:22:33.617 回答