2010-06-29 5 views
-1

J'ai une procédure stockée à laquelle je passe 4 variables, @ DCUId, @ SlaveAddress, @ DateFrom, @ dateToAide Utilisation de variables dans MS SQL Déclaration

Dans le SP je donne les résultats suivants:

DECLARE @MinAmbient decimal (4,1),@AverageAmbient decimal (4,1) 
DECLARE @MaxAmbient decimal (4,1) 

SELECT @MaxAmbient = MAX(CAST(T4 AS DECIMAL))/10, 
@MinAmbient = MIN(CAST(T4 AS DECIMAL))/10, 
@AverageAmbient = AVG(CAST(T4 AS DECIMAL))/10 
FROM RECORDEDDETAIL WHERE DCUId = CONVERT(nvarchar(4),@DCUId) 
AND SlaveId = @SlaveAddress 
AND timestamp BETWEEN convert(nvarchar(20), @DateFrom,113) 
AND convert(nvarchar(20), @DateTo,113) 

qui fonctionne bien.

Je veux faire de la valeur de la colonne 'T4' une variable que je peux transmettre, ie.

DECLARE @TLink nvarchar(3) 
SET @TLink = 'T4' 

faire quelque chose comme

SELECT @MaxAmbient = MAX(CAST(@TLink AS DECIMAL))/10, 
@MinAmbient = MIN(CAST(T4 AS DECIMAL))/10,..... 
.......... etc 

Quand je fais cela, je reçois une erreur ...

Qu'est-ce que je fais mal?

Merci

Roger

Pour clarifier exactement ce que je dois atteindre.

La colonne T4 fait référence à une température - cette valeur de température peut provenir de l'une des dix sondes. Le "mappage" de la sonde sur la colonne de température se fait via une autre table. Ainsi, la valeur de la colonne peut être Tx où x est compris entre 1 et 10.

Donc, avant la présente je déterminer la valeur de cadrage

DECLARE @TLink nvarchar (3) SELECT @TLink = TempLinks DE DCUConfigurations OÙ DCUID = @DCUId

+0

Votre seule option est d'aller avec sql dynamique. – Oded

Répondre

0

Vous ne pouvez pas utiliser le nom de variable de colonne de table dans la requête. vous devriez utiliser des requêtes dynamiques. ie.

DECLARE @TLink nvarchar(3) 
SET @TLink = 'T4' 

exec('select '[email protected]+' from myTable') 

mais j'éviterais d'utiliser ceux-ci autant que je peux. Mieux réécrire votre question que voulez-vous atteindre afin que nous puissions vous aider à y parvenir sans requêtes dynamiques qui sont instables et illisibles imho.

0

Vous lancez T4 en un nombre décimal, ce qui n'est pas possible, d'où le message d'erreur.

Je suppose que vous voulez passer dynamiquement le nom de la colonne. Avant de commencer, je suggère de lire cet article http://www.sommarskog.se/dynamic_sql.html

1

Vous pouvez y parvenir en utilisant les instructions CASE, bien que cela puisse devenir compliqué si vous avez beaucoup d'options de colonnes. Par exemple, si vous pouviez choisir les colonnes T1, T2, T3 ou T4 votre instruction SELECT ressemblerait à quelque chose comme ceci:

SELECT @MaxAmbient = MAX(CAST(CASE @Tlink WHEN 'T1' THEN T1 WHEN 'T2' THEN T2 WHEN 'T3' THEN T3 ELSE T4 END AS DECIMAL))/10 
     , @MinAmbient = MIN(CAST(CASE @Tlink WHEN 'T1' THEN T1 WHEN 'T2' THEN T2 WHEN 'T3' THEN T3 ELSE T4 END AS DECIMAL))/10 
     , @AverageAmbient = AVG(CAST(CASE @Tlink WHEN 'T1' THEN T1 WHEN 'T2' THEN T2 WHEN 'T3' THEN T3 ELSE T4 END AS DECIMAL))/10 
Questions connexes