Передать табличную переменную в хранимую процедуру?

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть эта таблица

 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;
  

Что я делаю не так?

Ответ №1:

table Ключевое слово зарезервировано для других сценариев, кроме передачи параметра.

Посмотрите этот пример из документации, который передает табличный параметр в хранимую процедуру путем создания пользовательского типа.

Ответ №2:

Вам нужно объявить пользовательский тип для таблицы.

 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....
  

Комментарии:

1. И параметр должен быть @data myTableType READONLY , поскольку в настоящее время в SQL Server поддерживаются только доступные только для чтения параметры типа табличных значений