Страница 1 из 1

TMSQuery.Options.AutoPrepare при работе с временными таблицами

Добавлено: Пн 25 апр 2016 12:56
DmitryG
MS SQL Server 2014
Имеется хранимая процедура, посредством которой происходит вставка во временную таблицу.
При включенной опции происходит ошибка "Не удалось определить метаданные, поскольку инструкция "insert into #zzId(inId) select @in1" в процедуре "pr_ZZPutId" использует временную таблицу."
При работе с 2008 сервером подобной ошибки не возникает.

RE: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Добавлено: Ср 27 апр 2016 06:17
DmitryG
Скрипт создания временной таблицы:

Код: Выделить всё

  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 при работе с временными таблицами

Добавлено: Ср 27 апр 2016 06:24
DmitryG

Код: Выделить всё

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 при работе с временными таблицами

Добавлено: Ср 27 апр 2016 07:50
AndreyZ
Причиной такого поведения является не SDAC, а особенность SQL Server Native Client версии 11 и мы не можем повлиять на это.

Для решения данной проблемы попробуйте для соединения использовать SQL Native Client provider ниже 11 версии или стандартный OLEDB провайдер. Пример кода чтобы использовать SQL Native Client provider 10:

Код: Выделить всё

MSConnection.Options.Provider := prNativeClient;
MSConnection.Options.NativeClientVersion := nc2008;
или для стандартного OLEDB провайдера:

Код: Выделить всё

MSConnection.Options.Provider := prSQL;

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Добавлено: Ср 27 апр 2016 10:06
DmitryG
Ранее мы использовали SDAC версии 6.0.1 и такой ошибки при работе с 2014 сервером не возникало.

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Добавлено: Чт 28 апр 2016 11:09
AndreyZ
Версия SDAC 6.0.1 не поддерживает SQL Server Native Client 11, т.к. была выпущена до выхода этой версии провайдера. Поэтому при использовании SDAC 6.0.1 описанная вами проблема не возникает.

Чтобы узнать какой провайдер используется для соединения с SQL Server, в дизайн-тайм на форме откройте редактор компонента TMSConnection, установите параметры соединения и нажмите Connect. Если соединения будет успешным, то на закладке Info вы увидите эту информацию о провайдере.

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Добавлено: Чт 28 апр 2016 11:39
DmitryG
Спасибо.
Думаю, нам придётся использовать явное указание в опциях версию нативного клиента.