1

免責事項: これは、FAQ ステートメントに従って投稿された「質問と回答の質問」です。その目的は、SQL Anywhere プログラミング コミュニティのメンバーに、「sqlanywhere」タグに実際のコンテンツをシードすることで、StackOverflow の使用を奨励することです。他の回答と同様に、編集は大歓迎です。それを容易にするために、また評判システムを悪用するという主張を避けるために、「コミュニティ ウィキ」とマークされています。

SQL Anywhere 9.0.2 用のストアド プロシージャを作成しています。コードは次のとおりです。

...
declare
@v_d datetime, @v_d1 datetime, @v_d2 datetime
....
select @v_d1 = @v_d, @v_d2 = dateadd(dd, 1, @v_d1)
...

@v_d2 が期待どおりに設定されないことが判明しました。次のように変更した場合:

...
declare
@v_d datetime, @v_d1 datetime, @v_d2 datetime
....
select @v_d1 = @v_d
select @v_d2 = dateadd(dd, 1, @v_d1)
...

何も起こらない、まったく同じ。最後に、次のように変更しました:

...
declare
@v_d datetime, @v_d1 datetime, @v_d2 datetime
....
begin
   select @v_d1 = @v_d
end
begin
   select @v_d2 = dateadd(dd, 1, @v_d1)
end
...

今では正常に動作しますが、ちょっとばかげているように見えます。私の質問は: それは既知の問題ですか? それとももっときれいにできますか?コメントをいただければ幸いです。ありがとう!

4

1 に答える 1

4

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 で同じです。

ブレック

于 2009-05-08T19:54:09.130 に答える