Transact-SQL SELECT リストでのホスト変数割り当てのスプレッドシート スタイルの自動再計算を探しています。Microsoft SQL Server なのか Sybase ASE なのか気になるところですが、これは SQL Anywhere...
元のコードの動作から、ホスト変数への参照 (dateadd の呼び出しでの @v_d1 への参照) は、再計算された値 (からの値@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)
あなたの 2 番目のバージョン (個別の 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'
スプレッドシート スタイルの再計算とホスト変数の割り当てが必要な場合は、INTO リストを使用できるように Watcom-SQL ダイアレクトに切り替えることをお勧めします。
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 で同じです。
ブレック