sql - 存储过程动态 T-SQL 查询无法正常工作

标签 sql t-sql sql-server-2008-r2

我正在使用 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 the GROUP 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

此外,您不能在 whereorder by 中使用别名 weight,您必须使用 FLOOR( dbo.Birds.weight * @INPUTconversion)*@INPUTintervaldbo.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/

相关文章:

php - 图像未加载到轮播中

mysql - 如何制作一个sql语句在distinct之前执行order by?

mysql - 如何使用sql sum函数添加重复行

sql-server - SQL Server 2014 : how long the stored procedures waited for lock

sql-server - 重写T-SQL按位逻辑

sql-server - 将非集群PK重建为集群PK?

.net - 处理数据库模式中的更改

sql-server - 为什么我的 CTE 连接更新速度比表变量连接慢得多?

winforms - SMO 恢复失败/无法打开备份设备错误

sql-server - 在 SQL SERVER 2008 中从字符串转换日期和/或时间时转换失败