Использовать LAG (COLUMN_NAME)
Запрос
SELECT id, School_ID, Enrollment_Start_Date, cOrder,
ISNULL((cOrder - (LAG(cOrder) OVER(PARTITION BY id, School_ID ORDER BY Enrollment_Start_Date))),cOrder)Diff
FROM Table1
Выход Samle
| id | School_ID | Enrollment_Start_Date | cOrder | Diff |
|----|-----------|-----------------------|--------|------|
| 1 | 56 | 2018-01-01 | 10 | 10 |
| 1 | 56 | 2018-05-05 | 24 | 14 |
| 1 | 56 | 2018-07-07 | 35 | 11 |
| 1 | 103 | 2019-03-03 | 19 | 19 |
| 1 | 103 | 2019-04-04 | 26 | 7 |
Я могу получить эту ошибку, используя Delphi 2007 и MSSQL Server 2008, и я нашел обходной путь. (это довольно дурацкое ИМХО, но может быть полезно вам, если ваш вызван той же самой причиной.) Код
, чтобы вызвать ошибку:
with TADOQuery.Create(nil)
do try
Connection := ADOConnection;
SQL.Text := ' (SELECT * FROM Stock WHERE InvCode = :InvCode ) '
+' (SELECT * FROM Stock WHERE InvCode = :InvCode ) ';
Prepared := true;
Parameters.ParamByName('InvCode').Value := 1;
Open; // <<<<< I get the "parameter object is...etc. error here.
finally
Free;
end;
Я нашел два способа ее исправить:
1) удалить скобки из SQL, то есть:
SQL.Text := ' SELECT * FROM Stock WHERE InvCode = :InvCode '
+' SELECT * FROM Stock WHERE InvCode = :InvCode ';
2) использовать два параметра вместо одного:
with TADOQuery.Create(nil)
do try
Connection := ADOConnection;
SQL.Text := ' (SELECT * FROM Stock WHERE InvCode = :InvCode1 ) '
+' (SELECT * FROM Stock WHERE InvCode = :InvCode2 ) ';
Prepared := true;
Parameters.ParamByName('InvCode1').Value := 1;
Parameters.ParamByName('InvCode2').Value := 1;
Open; // <<<<< no error now.
finally
Free;
end;
Если я помню хорошо, Вы имеете к явному помещенному Нулевому значению к параметру. При использовании компонента TAdoStoredProc необходимо сделать это во время проектирования.
Вы установили DataType параметра, или Вы оставляли его как ftUnknown?
Вы используете какую-либо поточную обработку? Я, кажется, не забываю получать эту ошибку, когда событие таймера запустило запрос, в то время как соединение ADO использовалось для другого синхронного запроса. (Таймер проверял "систему доступный" флаг каждую минуту).
Вот поздний ответ. В моем случае это было совсем другое.
Я попытался добавить хранимую процедуру в базу данных.
Query.SQL.Text :=
'create procedure [dbo].[test]' + #13#10 +
'@param int ' + #13#10 +
'as' + #13#10 +
'-- For the parameter you can pick two values:' + #13#10 +
'-- 1: Value one' + #13#10 +
'-- 2: Value two';
Когда я удалил двоеточие (:), это сработало. Поскольку он рассматривал двоеточие как параметр.