我有一个很大的存储过程,一些嵌套游标以一种方式获取一些参数。在这部分我得到了问题:
DECLARE @Avg_Dev float;
SET @sqlstatement = 'SELECT @Avg_Dev = AVG([' + @QLabel + '])
FROM Imported_Data
WHERE BrandID = ''' + CAST(@BrandID AS nvarchar(max)) + ''' AND CountryID = ''' + CAST(@CountryID AS nvarchar(max))
+ ''' AND [Year] = ''' + CAST(@Year AS nvarchar(max))
+ ''' AND ' + CAST(@QLabel AS nvarchar(max)) + ' <> ''' + CAST(@NoAnswer AS nvarchar(max)) + ''' ' + @Query;
EXEC sp_executesql @sqlstatement, N'@Avg_Dev float output', @Avg_Dev output;
PRINT 'AVG Check'; PRINT @Avg_Dev;
@BrandID
和@CountryID
为GUID
,@Year
为int
,@QLabel
为int
和@Query
是nvarchar(max)
。 @NoAnswer
包含一个不需要考虑的特殊值。
@QLabel
包含我正在处理的列。
@Query
包含要应用于where语句的条件,并且每个@QLabel
都有所不同。问题是@Avg_Dev总是包含四舍五入到最接近的整数的值,我看不出原因。 @QLabel
可以是1到10之间的值。
我知道这不容易阅读,但我发现没有其他方法可以动态处理表格,每个参数经常变化。
答案 0 :(得分:1)
这里的问题是列(QLabel)被定义为整数。因此AVG()将返回一个整数(忽略小数)并将其推入浮点变量。试试这个:
SET @sqlstatement = 'SELECT @Avg_Dev = AVG(convert(float,[' + @QLabel + ']))
FROM Imported_Data
WHERE BrandID = ''' + CAST(@BrandID AS nvarchar(max)) + ''' AND CountryID = ''' + CAST(@CountryID AS nvarchar(max))
+ ''' AND [Year] = ''' + CAST(@Year AS nvarchar(max))
+ ''' AND ' + CAST(@QLabel AS nvarchar(max)) + ' <> ''' + CAST(@NoAnswer AS nvarchar(max)) + ''' ' + @Query;