我正在使用 SQL Server 2008 R2,并且我的动态 T-SQL 查询遇到了问题。我相信这与我的语法有关,但是当从动态 T-SQL 上下文中取出时,它可以在新的查询窗口中正常运行。当作为存储过程运行时,我有时会收到以下错误:
Column
dbo.Birds.weight
is invalid in the select list because it is not contained in either an aggregate function or theGROUP BY
clause.
T-SQL 代码:
set @sql =
N'select FLOOR(dbo.Birds.weight * @INPUTconversion)*@INPUTinterval as ''Weight'',
COUNT(1) as ''Count''
FROM dbo.Birds
WHERE
weight >= @INPUTminwgt AND
weight <= @INPUTmaxwgt
GROUP BY FLOOR(weight*@INPUTconversion)
order by weight asc'
set @params =
N'@INPUTminwgt float,
@INPUTmaxwgt float,
@INPUTconversion float,
@INPUTinterval float';
exec sp_executesql @sql, @params,
@INPUTminwgt = @BirdMinWeight,
@INPUTmaxwgt = @BirdMaxWeight,
@INPUTconversion = @conversion,
@INPUTinterval = @interval;
权重精确到小数点后 1000 位(例如 3.154)
@INPUTconversion = 1/interval
查询应返回最小和最大权重参数之间的权重,并按间隔分组(例如,0.1 间隔类似于 1.1、1.2、1.3、1.4,其中包含该重量范围内的鸟类总数)
感谢任何帮助
最佳答案
在分组依据中,缺少*@INPUTintervals
。
应该是GROUP BY FLOOR(dbo.Birds.weight * @INPUTconversion)*@INPUTinterval
此外,您不能在 where
和 order by
中使用别名 weight
,您必须使用 FLOOR( dbo.Birds.weight * @INPUTconversion)*@INPUTinterval
或 dbo.Birds.weight
因为这里您需要哪一个并不明确。
set @sql =
N'select FLOOR(dbo.Birds.weight * @INPUTconversion)*@INPUTinterval as ''Weight'',
COUNT(1) as ''Count''
FROM dbo.Birds
WHERE
dbo.Birds.weight >= @INPUTminwgt AND
dbo.Birds.weight <= @INPUTmaxwgt
GROUP BY FLOOR(weight*@INPUTconversion) *@INPUTinterval
order by FLOOR(weight*@INPUTconversion) *@INPUTinterval asc'
关于sql - 存储过程动态 T-SQL 查询无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12677635/