将表变量传递给存储过程?

时间:2020-09-21 15:36:49

标签: sql sql-server

我有这张桌子

CREATE TABLE [dbo].[Sale]
(
    [SaleId] [int] IDENTITY(1,1) PRIMARY KEY,
    [SaleDate] [datetime] NOT NULL DEFAULT GETDATE(),
    [UserPhone] char(10) NOT NULL,
    [NumberSale] [int] NOT NULL,
)

然后我有这个表变量

DECLARE @sale1 TABLE  
               (
                   Phone char(10), 
                   GoodId int, 
                   GoodCount int
               )

INSERT INTO @sale1 
VALUES ('0671112221', 1, 2),
       ('0671112221', 4, 1),
       ('0671112221', 13, 2);

我正在创建一个存储过程,以使用表变量将数据输入到表中。但是表带有下划线。

CREATE PROCEDURE spSalesAndSalesPosInsert
    @data table -- here is  a mistake 
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION;
            
        INSERT INTO Sale (UserPhone, NumberSale)
            SELECT Phone, GoodCount 
            FROM @data
        
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION;       
    END CATCH;
END;

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

print_r($_COOKIE);关键字保留给传递参数以外的其他情况。

从文档中看this example,该文档通过创建user-defined type表值参数传递给存储过程。

答案 1 :(得分:0)

您需要为表声明用户定义的类型。

CREATE TYPE myTableType AS TABLE
(
    Phone char(10), GoodId int, GoodCount int
)

然后您可以使用它:

declare @sale1 myTableType
insert into @sale1 
values
('0671112221', 1, 2),
('0671112221', 4, 1),
('0671112221', 13, 2);

create proc spSalesAndSalesPosInsert
@data myTableType
as
begin
    --Etc....