Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL函数:无法绑定多部分标识符_Sql_Sql Server_Sql Server 2008_Function - Fatal编程技术网

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

SQL函数:无法绑定多部分标识符,sql,sql-server,sql-server-2008,function,Sql,Sql Server,Sql Server 2008,Function,我试图从我的桌子上选择所有没有在特定日期预订的“舱位”。我对SQL相当陌生,据我所知,我的问题是我无法访问“bookedWeeks”表,因为我正在选择我的“CAB”表。我尝试过使用内部联接,但我不知道如何使其工作 我在论坛上搜索过类似的错误,但没有一个真正符合我的目的 它告诉我无法绑定多部分标识符“bookedWeeks.cabinNr” CREATE FUNCTION showAllUnbooked (@weekToCheck integer) RETURNS Cabin AS BEG

我试图从我的桌子上选择所有没有在特定日期预订的“舱位”。我对SQL相当陌生,据我所知,我的问题是我无法访问“bookedWeeks”表,因为我正在选择我的“CAB”表。我尝试过使用内部联接,但我不知道如何使其工作

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

它告诉我无法绑定多部分标识符“bookedWeeks.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
我想在这里得到一些帮助。 谢谢

试试这个:

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

你可以走两条不同的路。 使用连接:

SELECT * 
FROM Cabin 
JOIN bookedWeeks on Cabin.CNr = bookedWeeks.CabinNr AND @weekToCheck != bookedWeeks.weekNr
或者使用where子句从两个表中选择记录(几乎是您的查询,但在from中添加了bookedWeeks)

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

连接可能会执行得更好,但两个查询都会返回相同的结果。

有几个小问题:您需要在
from
子句中声明
bookedWeeks
,但您还需要声明函数返回的结果略有不同:

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
中不匹配的记录。此外,它只检查指定的周,因此可能会更有效。最后,最好不要使用*来标识查询返回的列。这主要是一个维护问题,以说明可能影响此fu的更改NC操作。

您的数据库中是否有“bookedWeeks”对象?您的FROM子句中缺少bookedWeeks表。Slect*是SQL反模式,不应在生产代码中使用。切勿建议使用隐式联接的SQL反模式。此外,如果您没有联接,请选择*在联接字段中两次返回相同的dat,这是低效的。