Вы ищете автоматический пересчет в стиле электронных таблиц для назначения переменных хоста в списке SELECT Transact-SQL. Мне любопытно, делают ли это Microsoft SQL Server или Sybase ASE, но это SQL Anywhere ...
Из поведения вашего исходного кода это выглядит как ссылки на переменные хоста (ссылка на @ v_d1 в обращении к dateadd) всегда ссылаются на значения, которые существовали на момент запуска оператора (ноль), а не на пересчитанное значение ( значение из @v_d):
CREATE PROCEDURE p AS
declare
@v_d datetime, @v_d1 datetime, @v_d2 datetime
SELECT @v_d = CURRENT TIMESTAMP
select @v_d1 = @v_d, @v_d2 = dateadd(day, 1, @v_d1)
SELECT @v_d, @v_d1, @v_d2
GO
SELECT * FROM p();
@v_d,@v_d1,@v_d2
'2009-05-08 15:13:43.964','2009-05-08 15:13:43.964',(NULL)
Вы сообщаете, что ваша вторая версия (отдельные операторы SELECT) не работает, но у меня работает следующее:
DROP PROCEDURE p;
CREATE PROCEDURE p AS
declare
@v_d datetime, @v_d1 datetime, @v_d2 datetime
SELECT @v_d = CURRENT TIMESTAMP
select @v_d1 = @v_d
select @v_d2 = dateadd(dd, 1, @v_d1)
SELECT @v_d, @v_d1, @v_d2
GO
SELECT * FROM p();
@v_d,@v_d1,@v_d2
'2009-05-08 15:12:54.339','2009-05-08 15:12:54.339','2009-05-09 15:12:54.339'
Перерасчет в стиле электронной таблицы, который вы ищете, применяется для выбора элементов списка, закодированных как «выражение AS-идентификатор» (но это не совсем то, что вам нужно) ...
DROP PROCEDURE p;
CREATE PROCEDURE p AS
declare @v_d datetime
SELECT CURRENT TIMESTAMP INTO @v_d
select @v_d AS v_d, dateadd(day, 1, v_d) AS v_d1, dateadd(day, 1, v_d1) AS v_d2
GO
SELECT * FROM p();
v_d,v_d1,v_d2
'2009-05-08 15:14:27.292','2009-05-09 15:14:27.292','2009-05-10 15:14:27.292'
Если вы хотите выполнить перерасчет в стиле электронных таблиц И хотите, чтобы вам присваивались переменные хоста, я предлагаю вам переключиться на диалект Watcom-SQL, чтобы вы могли использовать список INTO:
DROP PROCEDURE p;
CREATE PROCEDURE p() BEGIN
DECLARE @v_d datetime;
DECLARE @v_d1 datetime;
DECLARE @v_d2 datetime;
SET @v_d = CURRENT TIMESTAMP;
SELECT @v_d AS v_d,
dateadd(day, 1, v_d) AS v_d1,
dateadd(day, 1, v_d1) AS v_d2
INTO @v_d,
@v_d1,
@v_d2;
SELECT @v_d,
@v_d1,
@v_d2;
END;
SELECT * FROM p();
@v_d,@v_d1,@v_d2
'2009-05-08 15:27:09.808','2009-05-09 15:27:09.808','2009-05-10 15:27:09.808'
Поведение аналогично в версиях SQL Anywhere 9.0.2 и 11.0.1.
Брек