这已经解决了。该声明是存储过程的另一部分。
我写的存储过程不允许我这样做:
declare @dtTopDate datetime
select top 1 @dtTopDate = date_build
from database..table
where database..table.parent = @Parent
and database..table.child = @Child
order by date_build desc
给我这个错误:
列“database..table.date_build”是 在ORDER BY子句中无效,因为 它不包含在任何一个中 聚合函数或GROUP BY 子句。
我做错了什么?
[编辑]这里没有group by语句。 SQL2005。
以下是更多背景信息:
if @Notify = 0
begin
declare @dtTopDate datetime
select top 1 @dtTopDate = date_build
from database..table
where database..table.parent = @Parent
and database..table.child = @Child
order by date_build desc
insert
into database2..table
(parent, child, notification_date, change_date)
values (@Parent, @Child, @dtTopDate, getdate())
return
end
答案 0 :(得分:2)
这适用于我,但我不确定这是否是你要做的事情b / c你的例子有一些错误。
use Test
go
CREATE TABLE [dbo].[MyTable]
(
[MyTableId] [uniqueidentifier] NOT NULL,
[MyDate] [datetime] NOT NULL,
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED([MyTableId] ASC,[MyDate] ASC)
)
GO
CREATE PROCEDURE ProcTopDate
(
@MyDate datetime OUT
)
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 1
@MyDate = [MyDate]
FROM [Test].[dbo].[MyTable]
order by MyDate
END
GO
insert into MyTable(MyTableId, MyDate)
values(newid(), getdate())
go
declare @MyDate datetime
exec ProcTopDate @MyDate OUT
print @MyDate
答案 1 :(得分:2)
而不是SELECT TOP 1 ... ORDER BY ...
为什么不尝试SELECT MAX(..
DECLARE @dtTopDate datetime
SELECT @dtTopDate = MAX(date_build)
from database..table
where database..table.parent = @Parent
and database..table.child = @Child
答案 2 :(得分:1)
您使用的是哪个版本的SQL?它在MS SQL Server 2005上运行正常(我修复了声明)。
答案 3 :(得分:1)
老实说,我唯一看错的是@dtTopDate = / = @dtLatestDate 除此之外,SQL语句中没有 GROUP BY 子句。
我刚刚运行它并且运行正常。
declare @OrderDate datetime
select top 1 @OrderDate = OrderDate
from Orders
where Orders.CustomerID = 'ALFKI'
and Orders.EmployeeID = 4
order by OrderDate desc
SELECT @OrderDate
答案 4 :(得分:1)
尝试正确限定列以避免任何歧义或x-database架构问题
declare @dtTopDate datetime
select top 1
@dtTopDate = [database]..[table].date_build
FROM
[database]..[table]
where
[database]..[table].parent = @Parent
and [database]..[table].child = @Child
order by
[database]..[table].date_build desc
或别名
declare @dtTopDate datetime
select top 1
@dtTopDate = foo.date_build
FROM
[database]..[table] foo
where
foo.parent = @Parent
and foo.child = @Child
order by
foo.date_build desc
答案 5 :(得分:1)
问题出在存储过程的另一部分。我在其他地方使用了一个计数(*),它需要一个分组。谢谢你的帮助。
答案 6 :(得分:0)
尝试SELECT @dtLatestDate = TOP 1 date_build ...
答案 7 :(得分:0)
如果你想变得非常棘手,在T-SQL中你可以尝试使用row_number()方法和内部选择:
select * from
(
select
db.groupId
, db.date_build
, date_build_rank = row_number() over ( partition by db.groupId order by db.date_build desc)
from
#date_build_tbl db
) as a
where a.date_build_rank < 2;