TMSQuery.Options.AutoPrepare при работе с временными таблицами
TMSQuery.Options.AutoPrepare при работе с временными таблицами
MS SQL Server 2014
Имеется хранимая процедура, посредством которой происходит вставка во временную таблицу.
При включенной опции происходит ошибка "Не удалось определить метаданные, поскольку инструкция "insert into #zzId(inId) select @in1" в процедуре "pr_ZZPutId" использует временную таблицу."
При работе с 2008 сервером подобной ошибки не возникает.
Имеется хранимая процедура, посредством которой происходит вставка во временную таблицу.
При включенной опции происходит ошибка "Не удалось определить метаданные, поскольку инструкция "insert into #zzId(inId) select @in1" в процедуре "pr_ZZPutId" использует временную таблицу."
При работе с 2008 сервером подобной ошибки не возникает.
RE: TMSQuery.Options.AutoPrepare при работе с временными таблицами
Скрипт создания временной таблицы:
Скрипт процедуры для вставки во временную таблицу:
Код: Выделить всё
if object_id('TempDb..#zzId') is not null drop table #zzId
create table #zzId
(
inId int
)
Код: Выделить всё
if object_id('dbo.pr_ZZPutId', 'P') is not null drop procedure dbo.pr_ZZPutId
go
create procedure dbo.pr_ZZPutId
(
@in1 integer = null,
@in2 integer = null,
@in3 integer = null,
@in4 integer = null,
@in5 integer = null,
@in6 integer = null,
@in7 integer = null,
@in8 integer = null,
@in9 integer = null,
@in10 integer = null,
)
with encryption,
execute as owner
as
insert into #zzId(inId) select @in1
insert into #zzId(inId) select @in2
insert into #zzId(inId) select @in3
insert into #zzId(inId) select @in4
insert into #zzId(inId) select @in5
insert into #zzId(inId) select @in6
insert into #zzId(inId) select @in7
insert into #zzId(inId) select @in8
insert into #zzId(inId) select @in9
insert into #zzId(inId) select @in10
go
Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
idArray: array [0..9] of Variant;
begin
{MSQuery1.SQL.Text := if object_id('TempDb..#zzId') is not null drop table #zzId
create table #zzId
(
inId int
)
}
MSQuery1.ExecSQL; // Создание временной таблицы
for i := 0 to 5 do
idArray[i] := i;
for i := 6 to 9 do
idArray[i] := null;
MSQuery2.Options.AutoPrepare := true; // <<<<<<<<<<<
for i := 0 to 9 do
MSQuery2.ParamByName('Id_' + IntToStr(i + 1)).Value := idArray[i];
{ Вызов процедуры вставки
MSQuery2.SQL.Text := exec dbo.pr_ZZPutId
@in1 = :Id_1,
@in2 = :Id_2,
@in3 = :Id_3,
@in4 = :Id_4,
@in5 = :Id_5,
@in6 = :Id_6,
@in7 = :Id_7,
@in8 = :Id_8,
@in9 = :Id_9,
@in10 = :Id_10
}
MSQuery2.Execute;
end;
Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами
Причиной такого поведения является не SDAC, а особенность SQL Server Native Client версии 11 и мы не можем повлиять на это.
Для решения данной проблемы попробуйте для соединения использовать SQL Native Client provider ниже 11 версии или стандартный OLEDB провайдер. Пример кода чтобы использовать SQL Native Client provider 10:
или для стандартного OLEDB провайдера:
Для решения данной проблемы попробуйте для соединения использовать SQL Native Client provider ниже 11 версии или стандартный OLEDB провайдер. Пример кода чтобы использовать SQL Native Client provider 10:
Код: Выделить всё
MSConnection.Options.Provider := prNativeClient;
MSConnection.Options.NativeClientVersion := nc2008;
Код: Выделить всё
MSConnection.Options.Provider := prSQL;
Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами
Ранее мы использовали SDAC версии 6.0.1 и такой ошибки при работе с 2014 сервером не возникало.
Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами
Версия SDAC 6.0.1 не поддерживает SQL Server Native Client 11, т.к. была выпущена до выхода этой версии провайдера. Поэтому при использовании SDAC 6.0.1 описанная вами проблема не возникает.
Чтобы узнать какой провайдер используется для соединения с SQL Server, в дизайн-тайм на форме откройте редактор компонента TMSConnection, установите параметры соединения и нажмите Connect. Если соединения будет успешным, то на закладке Info вы увидите эту информацию о провайдере.
Чтобы узнать какой провайдер используется для соединения с SQL Server, в дизайн-тайм на форме откройте редактор компонента TMSConnection, установите параметры соединения и нажмите Connect. Если соединения будет успешным, то на закладке Info вы увидите эту информацию о провайдере.
Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами
Спасибо.
Думаю, нам придётся использовать явное указание в опциях версию нативного клиента.
Думаю, нам придётся использовать явное указание в опциях версию нативного клиента.