SQL函数:无法绑定多部分标识符

时间:2015-05-12 12:08:14

标签: sql sql-server sql-server-2008 function

我正在尝试选择所有的小屋'从我的表中未在特定日期预订。我对SQL很陌生,据我所知,我的问题是我无法访问“已预订周刊”表,因为我正在选择我的小屋#-table; -table。我尝试过使用INNER JOIN,但我无法弄清楚如何使它工作。

我在论坛上搜索了类似的错误,但似乎没有一个真的符合我的目的。

它告诉我多部分标识符已经预订了Weeks.cabinNr'无法绑定

CREATE FUNCTION showAllUnbooked (@weekToCheck integer)
    RETURNS Cabin
AS
BEGIN

RETURN
(
SELECT * FROM Cabin WHERE Cabin.CNr = bookedWeeks.CabinNr AND @weekToCheck != bookedWeeks.weekNr
)
END
GO

我会在这里得到一些帮助。 感谢

3 个答案:

答案 0 :(得分:1)

一些小问题:bookedWeeks子句中需要from,但您还需要声明函数返回的内容有所不同:

create function showAllUnbooked ( @weekToCheck integer ) returns table as
return
(
    select
        * --> should not use * - explicitly list columns instead
    from 
        Cabin 
        left outer join 
        BookedWeeks 
        on 
            Cabin.CNr = BookedWeeks.CabinNr
    where
        BookedWeeks.WeekNr = @weekToCheck
        and
        BookedWeeks.CabinNr is null
)

左连接意味着您将获得"所有小屋"最初,但会排除BookedWeeks中不匹配的记录。此外,它只检查指定的周 - 所以它可能会更有效率。最后,不使用*来识别查询返回的列是个好主意。这主要是维护问题,以考虑可能影响此功能的更改。

答案 1 :(得分:0)

试试这个:

CREATE FUNCTION showAllUnbooked (@weekToCheck integer)
    RETURNS Cabin
AS
BEGIN

RETURN
(
SELECT * 
FROM Cabin 
JOIN bookedWeeks on Cabin.CNr = bookedWeeks.CabinNr 
                 AND @weekToCheck != bookedWeeks.weekNr
)
END
Go

答案 2 :(得分:0)

您可以采用两种不同的路径。 使用join:

SELECT * 
FROM Cabin 
JOIN bookedWeeks on Cabin.CNr = bookedWeeks.CabinNr AND @weekToCheck != bookedWeeks.weekNr

或者使用你的where子句从两个表中选择记录(几乎是你的查询,但是将dailyWeeks添加到from。

SELECT * 
FROM Cabin, bookedWeeks 
WHERE Cabin.CNr = bookedWeeks.CabinNr AND @weekToCheck != bookedWeeks.weekNr

联接可能会表现得更好,但两个查询都会返回相同的结果。