帮助在MS SQL语句中使用变量

时间:2010-06-29 08:04:35

标签: sql-server

我有一个存储过程,我传递了4个变量, @ DCUId,@ SlaveAddress,@ DateFrom,@ DateTo

在SP中我有以下内容:

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)

工作正常。

我想让列值'T4'成为我可以传递的变量,即

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

然后执行类似

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

当我这样做时,我收到错误......

我做错了什么?

由于

罗杰

进一步澄清我需要达到的目标。

T4栏是指温度 - 此温度值可来自十个探头中的一个。探针与温度柱的“映射”通过另一个表完成。 因此列值可以是Tx,其中x介于1和10之间。

所以在此之前我确定了映射值

DECLARE @TLink nvarchar(3) SELECT @TLink = TempLinks FROM DCUConfigurations WHERE DCUID = @DCUId

3 个答案:

答案 0 :(得分:1)

你可以使用CASE语句实现这一点,尽管如果你有很多列选项可能会变得混乱。 例如,如果您可以选择列T1,T2,T3或T4,则SELECT语句将如下所示:

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

答案 1 :(得分:0)

您不能在查询中使用表列变量名。你应该使用动态查询。 即

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

exec('select '+@TLink+' from myTable')

虽然我会尽量避免使用这些。更好地重写你的问题你想要实现什么,所以我们可以帮助你实现它,而不需要动态查询,这些查询是不稳定且不可读的imho。

答案 2 :(得分:0)

您正在将T4转换为小数,这是不可能的,因此错误消息。

我猜你要动态传递列名。在开始之前,我建议您阅读这篇文章http://www.sommarskog.se/dynamic_sql.html