Табличный параметр ошибка READONLY в SQL Server 2008 R2 Express - PullRequest
0 голосов
/ 08 мая 2019

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

create type dbo.ut_Type1(
        Col1 varchar(10),
        Col2 varchar(10),
        Col3 int) 
go
create procedure dbo.p_Procedure1(
        @TVP ut_Type1 READONLY,
        @Year int,
        @ID int)
as
begin

Это вызов из клиентского приложения

var td:TMSTableData;

......

TMSQuery1.SQL.Text:='exec dbo.p_Procedure1 @TVP = :Par1, @Year = :Par2, @ID = :Par3';
TMSQuery1.ParamByName('Par1').AsTable:=td.Table;
TMSQuery1.ParamByName('Par2').AsInteger:=2019;
TMSQuery1.ParamByName('Par3').AsInteger:=4605;

Все работает нормально, за исключением одного конкретного SQLСервер.Вот выполнение из Profiler для этого сервера.( Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Express Edition с расширенными службами (64-разрядная версия))

declare @p3 dbo.ut_Type1
insert into @p3 values('001','112',142)

exec sp_executesql N'exec dbo.p_Procedure1 @Table = @P1, @Year = @P2, @ID = @P3', N'@P1 dbo.ut_Type1,@P2 int,@P3 int',@p3,2019,4605

И получение ошибки

"Табличный параметр @ P1 должен быть объявлен с опцией READONLY"

Я пробовал один и тот же вызов на аналогичном SQL Server (Microsoft SQL Server 2008 R2 (SP2) - 10.50.4042.0 (X64) Express Edition с расширенными службами (64-разрядная версия) .Вот выполнение из Profiler

declare @p3 dbo.ut_Type1
insert into @p3 values('001','112',142)

exec sp_executesql N'exec dbo.p_Procedure1 @Table = @P1, @Year = @P2, @ID = @P3', N'@P1 dbo.ut_Type1 READONLY,@P2 int,@P3 int',@p3,2019,4605

И не было получено ошибки.

Единственное отличие - это ключевое слово READONLY, которое отсутствует в первом табличном параметре сервера.

Есть ли какая-либо конфигурация для SQL Server, которую я должен установить?
Спасибо!

1 Ответ

0 голосов
/ 08 мая 2019

Согласно документации Microsoft, параметры таблицы имеют следующие ограничения:

  • SQL Server не ведет статистику по столбцам табличных параметров.
  • Должны быть переданы табличные параметрыв качестве входных параметров READONLY для процедур Transact-SQL.Вы не можете выполнять операции DML, такие как UPDATE, DELETE или INSERT, с табличным параметром в теле подпрограммы.
  • Нельзя использовать табличный параметр в качестве цели оператора SELECT INTO или INSERT EXEC.,Табличный параметр может быть в предложении FROM оператора SELECT INTO или в строке INSERT EXEC или хранимой процедуре.
...