SQL存储过程在选择列表错误中抛出无效

时间:2011-12-08 13:29:31

标签: sql-server stored-procedures group-by

我正在从mysql转换为sql server。

转换选择存储过程时,

CREATE PROCEDURE selPropertyByAcntID
(
@in_acntID INT
)
AS
SELECT *
     , SUM(CASE
                        WHEN u.prop_id IS NOT NULL THEN 1
                        ELSE 0
                 END) AS UnitCount
FROM 
    prop_details d
INNER JOIN 
    acnt_property a
ON 
    d.prop_id = a.prop_id
LEFT JOIN 
    unit_details u
ON 
    d.prop_id = u.prop_id
WHERE 
    a.group_id = @in_acntID
GROUP BY 
    d.prop_id;

抛出以下错误:

错误:8120严重级16 列'prop_details.prop_title'在选择列表中无效,因为它不是聚合函数或GROUP BY子句中的容器。

奇怪 - 完全相同的存储过程在mysql环境中工作。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

在SQL Server和几乎所有RDBMS MySQL之外,您只能在SELECT列表中包含GROUP BY列表中包含的项目或包含在聚合中的项目

因此要解决问题摆脱*,请从表da中仅选择所需的列,并将此列表也添加到GROUP BY

答案 1 :(得分:1)

只是一个注释,与您的问题无关。这部分:

 , SUM(CASE
              WHEN u.prop_id IS NOT NULL THEN 1
              ELSE 0
       END) AS UnitCount

可以简化为:

 , COUNT(u.prop_id) AS UnitCount

答案 2 :(得分:0)

使用SQL Server(我认为大多数RDBMS实际上......)GROUP BY语句只能包含分组列和聚合函数。例如,这将起作用:

SELECT ColumnA, SUM(ColumnB) TotalCount
FROM Table
GROUP BY ColumnA;

但这不会:

SELECT ColumnA, ColumnC, ColumnD, SUM(ColumnB) TotalCount
FROM Table
GROUP BY ColumnA;

因为ColumnCColumnD未被分组。

答案 3 :(得分:0)

在您的选择中,您选择*,但仅按prop_id进行分组。如果您将*更改为d.prop_id,那么您应该感觉良好。如果您需要任何其他列,请在select和group by中指定它们。