#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 поддерживаются только доступные только для чтения параметры типа табличных значений