如何让SQL SELECT@variable=表达式分配像电子表格一样工作?

如何让SQL SELECT@variable=表达式分配像电子表格一样工作?,sql,stored-procedures,variables,variable-assignment,sqlanywhere,Sql,Stored Procedures,Variables,Variable Assignment,Sqlanywhere,免责声明:这是根据FAQ声明发布的“提问和回答问题”,即“提问和回答您自己的编程问题完全可以”。其目的是鼓励sqlanywhere编程社区的成员使用StackOverflow,方法是在“sqlanywhere”标记中植入一些真实内容。编辑是受欢迎的,其他答案也是如此,它被标记为“社区维基”,以促进这一点,并避免声称与声誉系统博弈 我正在为SQL Anywhere 9.0.2编写一个存储过程,下面是一些代码: ... declare @v_d datetime, @v_d1 datetime, @

免责声明:这是根据FAQ声明发布的“提问和回答问题”,即“提问和回答您自己的编程问题完全可以”。其目的是鼓励sqlanywhere编程社区的成员使用StackOverflow,方法是在“sqlanywhere”标记中植入一些真实内容。编辑是受欢迎的,其他答案也是如此,它被标记为“社区维基”,以促进这一点,并避免声称与声誉系统博弈

我正在为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
...
现在它很好用,不过看起来有点傻。 我的问题是:这是一个已知的问题吗?或者我可以做得更整洁些?任何 如有意见,将不胜感激。
谢谢

您正在为Transact-SQL选择列表中的主机变量分配寻找电子表格样式的自动重新计算。我很好奇Microsoft SQL Server或Sybase ASE是否会这样做,但这是SQL Anywhere

从原始代码的行为来看,对主机变量的引用(对dateadd的调用中对@v_d1的引用)似乎总是引用语句启动时存在的值(null),而不是重新计算的值(来自@v_d的值):

您报告您的第二个版本(单独的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'
您正在寻找的电子表格样式的重新计算确实适用于选择编码为“表达式作为标识符”的列表项(但这并不是您想要的)

如果您想要电子表格样式的重新计算,并且想要主机变量分配,我建议您切换到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中的行为相同


Breck

您正在寻找Transact-SQL选择列表中主机变量分配的电子表格式自动重新计算。我很好奇Microsoft SQL Server或Sybase ASE是否会这样做,但这是SQL Anywhere

从原始代码的行为来看,对主机变量的引用(对dateadd的调用中对@v_d1的引用)似乎总是引用语句启动时存在的值(null),而不是重新计算的值(来自@v_d的值):

您报告您的第二个版本(单独的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'
您正在寻找的电子表格样式的重新计算确实适用于选择编码为“表达式作为标识符”的列表项(但这并不是您想要的)

如果您想要电子表格样式的重新计算,并且想要主机变量分配,我建议您切换到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中的行为相同


布雷克

WTF?你问了这个问题,然后马上公布了答案?在你尝试玩徽章游戏的时候,尽量少一点透明度。如果你不是在搞名誉的话,你在做什么?如果您想有一个一般的SQLAnywhere问题,它应该是CommunityWiki,而不是充满非常具体的代码示例。如果你想要一个答案,为什么要在提问后立即发布?似乎你已经有了问题的答案,并且正在发布它以获得一些声誉。这种做法不仅是允许的,@welblog和@Pesto,而且是鼓励的。@Gortok:当问题、答案和样本足够普遍,几乎适用于任何情况时,当然可以。我完全同意。这种具体情况与鼓励的做法相去甚远。在Joel Spolsky的Google Techtalk中,FAQ的第一页说“问和回答你自己的编程问题也很好”,StackOverflow的主要目的是成为一个关于编程的规范问题和答案的存储库。我这样做的主要原因是,通过增加“sqlanywhere”标记的计数,鼓励其他sqlanywhere用户前来询问StackOverflow问题。徽章不重要。声誉点是达到目的的手段(发表评论的能力等)。WTF?你问了这个问题,然后马上公布了答案?在你尝试玩徽章游戏的时候,尽量少一点透明度。如果你不是在搞名誉的话,你在做什么?如果您想有一个一般的SQLAnywhere问题,它应该是CommunityWiki,而不是充满非常具体的代码示例。如果你想要一个答案,为什么要在提问后立即发布?似乎你已经有了问题的答案,并且正在发布它以获得一些声誉。这种做法不仅是允许的,@welblog和@Pesto,而且是鼓励的。@Gortok:当问题、答案和样本足够普遍,几乎适用于任何情况时,当然可以。我完全同意。这种具体情况与鼓励的做法相去甚远。在Joel Spolsky的Google Techtalk中,FAQ的第一页说“问和回答你自己的编程问题也很好”,StackOverflow的主要目的是成为一个关于编程的规范问题和答案的存储库。我这样做的主要原因是,通过增加“sqlanywhere”标记的计数,鼓励其他sqlanywhere用户前来询问StackOverflow问题。徽章不重要。声誉积分是达到目的的一种手段(能够发表评论等)。+1对不阅读常见问题解答的人表示不满并对这些问题进行否决投票。+1对不阅读常见问题解答的人表示不满并对这些问题进行否决投票。