我有一个存储过程,我传递了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
答案 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