TMSScript и знак деления

Обсуждение возникших проблем, предложений и ошибок SDAC компонентов
Ответить
saupg
Сообщения: 18
Зарегистрирован: Вт 06 май 2014 07:01

TMSScript и знак деления

Сообщение saupg » Вт 06 май 2014 07:54

Здравствуйте!

Когда-то я уже пытался обновить свой проект на новую версию SDAC, и этому помешал один досадный баг: в SQL-скриптах почему-то нельзя использовать знак деления "/", если он расположен отдельно на одной строке.
http://forums.devart.com/viewtopic.php?f=6&t=27412

Тогда переход на новую версию так и не состоялся, а сейчас у меня гораздо больше решительности - не за горами переход с Delphi XE и SQL Server 2005 на что-то по-новее. :)
Хотелось бы "дотыкать" этот момент, к тому же подписка на компоненты уже оплачена 8)

Итак, у меня есть много файлов со скриптами создания хранимых процедур, которые загружаются в базу данных с помощью компонента TMSScript. В хранимых процедурах в запросах встречаются вычисления довольно длинной формы с использованием деления. И для наглядности кода (когда делимое и делитель представляют собой большие выражения по ширине экрана) символ деления выносится на отдельную строку.

На новой версии SDAC этот символ воспринимается как разделитель (с чего это вдруг?).
Например:

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

procedure TForm1.Button1Click(Sender: TObject);
var
  MSConnection: TMSConnection;
  MSScript: TMSScript;
begin
  MSConnection := TMSConnection.Create(Self);
  MSScript := TMSScript.Create(Self);
  try
    MSConnection.Authentication := auWindows;
    MSConnection.Server := 'db01';
    MSConnection.Database := 'master';
    MSConnection.LoginPrompt := False;

    MSScript.Connection := MSConnection;
    MSScript.SQL.Text := 'SELECT'#10#13 +
      '(10'#10#13 +
      '/'#10#13 +     // This line with error!
      '2) AS RES';
    MSScript.Execute;
  finally
    MSScript.Free;
    MSConnection.Free;
  end;
end;
При выполнении этого кода получаю ошибку: "Неправильный синтаксис около конструкции...".
Поганить свой код, перенося "/" на непустую строчку, из-за чьей глупости я не хочу. На 5-ой версии SDAC всё работает прекрасно (самая последняя 5-я версия, 5.10.0.8).
Исправьте, пожалуйста.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: TMSScript и знак деления

Сообщение AndreyZ » Ср 07 май 2014 14:44

Указанный вами скрипт не выполняется даже в SDAC версии 5.10.0.8. Пожалуйста, уточните, какой скрипт выполняется в старой версии без ошибок и не выполняется в новой версии SDAC.

saupg
Сообщения: 18
Зарегистрирован: Вт 06 май 2014 07:01

Re: TMSScript и знак деления

Сообщение saupg » Чт 08 май 2014 08:19

Да, действительно, мой пример универсален, и даёт ошибку на любой версии.
Странно, но все мои скрипты создания хранимых процедур с таким же отдельно стоящим знаком деления выполняются нормально на старой версии, а на новой дают такую вот ошибку.

Кстати, в некоторых скриптах встречается, что знак деления стоит первым символом в строке, а за ним располагается делитель. И в каких-то случаях возникает такая же ошибка. Какой-либо закономерности я не вижу.

И ещё одно наблюдение - если текст скрипта вставить в компонент MSScript на форме, то всё хорошо. При загрузке того же скрипта из файла (MSScript.SQL.LoadFromFile) - получаем ошибку.

Немного поколдовал со своими скриптами и получилось родить один пример.

Сохраните скрипт в файл:

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

IF(EXISTS(SELECT 1 FROM sys.objects WHERE object_id=OBJECT_ID('spTest','P')))
DROP PROCEDURE dbo.spTest
GO 
CREATE PROCEDURE dbo.spTest
(
  @ID smallint,
  @ID_TEST smallint
)  
AS
BEGIN
  DECLARE @TEST SMALLINT
  SET @TEST=10
  ;WITH M(CNT) AS
  (
    SELECT @TEST
    UNION ALL
    SELECT CAST(CNT + 1 AS SMALLINT)
    FROM M
    WHERE M.CNT < @TEST
  )
  SELECT 
    COUNT(ID) AS CNT
  FROM M
  CROSS APPLY
  (
    SELECT 
      (10 
        / 
      2) AS ID
  ) A
END
Затем загружаем его в коде и пытаемся выполнить:

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

procedure TForm1.Button2Click(Sender: TObject);
var
  MSConnection: TMSConnection;
  MSScript: TMSScript;
begin
  MSConnection := TMSConnection.Create(Self);
  MSScript := TMSScript.Create(Self);
  try
    MSConnection.Authentication := auWindows;
    MSConnection.Server := 'db01';
    MSConnection.Database := 'master';
    MSConnection.LoginPrompt := False;

    MSScript.Connection := MSConnection;
    MSScript.SQL.LoadFromFile('D:\test.sql');

    MSScript.Execute;
  finally
    MSScript.Free;
    MSConnection.Free;
  end;
end;
На 6-ой версии в таком виде - не работает. Если текст скрипта поместить в компонент в дизайне, то работает. На 5-ой версии проблем никаких нет.

Да и собственно, речь идёт не о том, что в какой-то версии работает, а в какой-то нет. Мой пример наглядно продемонстрировал проблему - абсолютно валидный с точки зрения синтаксиса T-SQL скрипт не выполняется через ваш компонент.
Исправьте, пожалуйста.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: TMSScript и знак деления

Сообщение AndreyZ » Чт 08 май 2014 10:54

Спасибо за информацию. Мы воспроизвели проблему и будем ее исследовать.

Ответить