1

Clause de non-responsabilité: Ceci est une "question posée et répondue" postée conformément à la déclaration de la FAQ qu'il est "parfaitement bien de poser et de répondre à votre propre question de programmation". Son but est d'encourager les membres de la communauté de programmation SQL Anywhere à utiliser StackOverflow en ajoutant la balise "sqlanywhere" à du contenu réel. Les modifications sont les bienvenues, tout comme d'autres réponses, et il a été marqué "community wiki" pour faciliter cela, ainsi que pour éviter les revendications de jeu du système de réputation.Comment obtenir SQL SELECT @variable = les affectations d'expression fonctionnent comme une feuille de calcul?

J'écris une procédure stockée SQL Anywhere 9.0.2, voici un code:

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

il se trouve que @ v_d2 ne sera pas réglé comme prévu. si je modifie à:

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

rien ne se passe, tout de même. enfin, je l'ai changé:

... 
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 
... 

maintenant il fonctionne très bien, semble un peu stupide cependant. Ma question est: est-ce un problème connu? ou peut-être que je pourrais le faire plus proprement? tous les commentaires seront appréciés. merci!

+0

+1 pour contrer les personnes qui ne lisent pas la FAQ et qui ont refusé ces questions. –

Répondre

4

Vous recherchez un recalcul automatique de type tableur pour les affectations de variables hôtes dans une liste SELECT Transact-SQL. Je suis curieux de savoir si Microsoft SQL Server ou Sybase ASE le font, mais c'est SQL Anywhere ...

Du comportement de votre code d'origine, il ressemble à des références aux variables hôte (la référence à @ v_d1 dans l'appel à DATEADD) se réfèrent toujours aux valeurs qui existaient lorsque l'instruction a commencé (null), et non la valeur recalculé (la valeur de @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) 

Vous déclarez que votre deuxième version (états séparés SELECT) ne travail, mais les œuvres suivantes pour moi:

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' 

Le recalcul de style tableur que vous recherchez ne s'applique pour sélectionner des éléments de liste codés « expression comme identifiant » (mais ce n'est pas exactement ce que vous voulez) ...

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' 

Si vous voulez recalcul style tableur et vous voulez organiser des affectations de variables, je vous suggère de passer au dialecte Watcom-SQL de sorte que vous pouvez utiliser la liste 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' 

le comportement est le même dans les versions SQL Anywhere 9.0.2 et 11.0.1.

Breck

+0

WTF? Vous avez posé la question et immédiatement posté la réponse? Essayez d'être un peu moins transparent dans votre tentative de jouer au système pour les badges. – Pesto

+0

Que faites-vous si la réputation n'est pas la prostitution? Si vous voulez avoir une question SQL Anywhere générale, il devrait s'agir d'un wiki de communauté et non pas d'exemples de code très spécifiques. Si vous voulez une réponse, pourquoi en poster une immédiatement après avoir demandé? Il semble que vous ayez déjà une réponse à votre question et que vous l'affichiez pour gagner de la réputation. – Welbog

+0

Cette pratique est non seulement autorisée, @welblog et @Pesto, mais elle est encouragée. –

Questions connexes