Ошибка параметра READONLY с табличным значением в SQL Server 2008 R2 Express

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

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 Server. Вот выполнение из 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, которые мне нужно установить?
Спасибо!


person xyz    schedule 08.05.2019    source источник
comment
Одинаков ли код процедуры на обоих серверах?   -  person Sean Lange    schedule 08.05.2019
comment
Привет хиз. Вы должны получить спецификацию READONLY для спецификации типа параметра в вызове sp_executesql.   -  person TT.    schedule 08.05.2019
comment
@SeanLange И хранимые процедуры, и клиентское приложение одинаковы.   -  person xyz    schedule 08.05.2019


Ответы (1)


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

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