2012-05-18 70 views
1

我正在使用一個存儲過程,在該存儲過程中,我發送的數據庫中的類型爲float,並且我還聲明參數float,該數據庫的類型爲@columnname
當我通過列名作爲浮動則給出了錯誤:如何將字段名稱作爲參數傳遞到存儲過程

Msg 8114, error converting data type nvarchar to float.

這是我的測試查詢

Declare @column float 
set @column = 'S_E1' 
select Avg(@column) from TBL_SENSORS 

而且當我改變參數類型varchar然後它給了我這個錯誤:

Msg 8117, Operand data type varchar is invalid for avg operator.

Declare @column varchar 
set @column = 'S_E1' 
select Avg(@column) from TBL_SENSORS 

我該如何解決這個問題?

UPDATE:

這是我的存儲過程:

ALTER PROCEDURE [dbo].[getAvgColumn] 
    @ColumnName float, 
    @StartDate DateTime, 
    @EndDate DateTime, 
    @Start int, 
    @End int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    declare @Skip int = 0 
    declare @Take int = 4 
    declare @count int = 0 

    set @count = (select count(@ColumnName) from TBL_SENSORS Where RECORD_TIMESTAMP Between @StartDate and @EndDate And (@ColumnName Between @Start And @End)) 

    while(@Skip < @count) 
    Begin 
     select avg(@ColumnName) 
     from 
      (select 
       @ColumnName as cc, 
       row_number() over (order by RECORD_TIMESTAMP) as rn 
      from 
       TBL_SENSORS 
      Where 
       RECORD_TIMESTAMP Between @StartDate and @EndDate 
       And (@ColumnName Between @Start And @End) 
      ) T 
    where 
     rn > @Skip and 
     rn <= @Skip + @Take 

    set @Skip = @Skip + @Take 
end 
END 
+0

如何取一個字符串的平均值? – keyser

+0

[Column-name和/或表名作爲參數]的可能重複(http://stackoverflow.com/questions/5791764/column-name-and-or-table-name-as-parameters) – GSerg

+1

您是否正在嘗試返回一個字段的平均值作爲參數傳遞給你的名字? – Quassnoi

回答

1

你需要動態SQL。

DECLARE @SQL NVARCHAR(4000) 
Declare @column varchar 
set @column = 'S_E1' 

SET @SQL = 'select Avg(' + quotename(@column) + ') from TBL_SENSORS' 

EXEC sp_executesql @SQL 

更新:同時適用建議quotenamesp_executesql

新方法:你可以使用動態SQL將數據放置到一個臨時表與已知架構。參考基於別名的列:ColumnToAvg。而不是TBL_SENSORS使用#TempSensors。

注意:在生產中,您需要檢查#TempSensors是否存在,如果存在則刪除。

SET @SQL = 'Select RECORD_TIMESTAMP, ' 
    + quotename(@ColumnName) 
    + ' as ColumnToAvg 
     INTO #TempSensors 
     from TBL_SENSORS 
     Where RECORD_TIMESTAMP Between @StartDate and @EndDate 
     And @ColumnName Between @Start And @End' 

EXECUTE sp_executesql @sqlCommand 
    , N'@StartDate datetime, @EndDate datetime, @Start int, @End int' 
    , @StartDate , @EndDate, @Start, @End 
+1

+1但是,我會推薦'EXEC sp_executesql @ SQL' – Curt

+2

您應該在構建查詢時使用[quotename](http://www.sommarskog.se/dynamic_sql.html#quotestring) 。 ''從TBL_SENSORS''選擇Avg('+ quotename(@colom)+')來保護自己免受SQL注入攻擊。 –

+0

@Jeff O請檢查問題現在我添加存儲過程的問題 – Sunny

相關問題