0

你好程序员我正在编写一个 TSQL 内联表函数,实际上我在 sql 中不够好,当我完成我的代码时,我得到了这个错误“'BEGIN'附近的语法不正确。” ,谁知道解决方法,请给我。顺便说一句,当我双击错误消息时,它选择了最后一个“结束”

create FUNCTION [dbo].[CheckLogin]
(   
    @un varchar(max),
    @pw varchar(max)
)
RETURNS TABLE 
AS
begin
    declare @unexist int, @unpwmatch int, @uid bigint
    declare @uisactivated bit , @uisdeleted bit
    -----
    set @unexist = (select COUNT(UserAccessInfo.UserId) FROM UsersAccessInfo 
    WHERE UserAccessInfo.UserName = @un OR UserAccessInfo.UserEmail = @un)
    ------
    set @unpwmatch = (select count(usersaccessinfo.userid) from usersaccesinfo
    WHERE (usersaccessinfo.UserName = @un) AND (usersaccessinfo.UserPassword = @pw) OR
    (usersaccessinfo.UserEmail = @un) AND (usersaccessinfo.UserPassword = @pw))
    ------
    set @uid =(select usersaccessinfo.userid from usersaccessinfo where
    serAccessInfo.UserName = @un OR UserAccessInfo.UserEmail = @un)
    ------
    if @uid <> Null
    begin
        set @uisactivated =(select usersaccessinfo.userisactivated from usersaccessinfo
        where usersaccessinfo.userid=@uid)
    end
    ------
    if @uid <> null
    begin
        set @uisactivated =(select usersaccessinfo.userisactivated from usersaccessinfo
        where usersaccessinfo.userid=@uid)
    end
    ------
    if @unexist = 0
    begin
        select dbo.getreportbyid('1004')
    end;
    else if @unpwmatch = 0
    begin
        select dbo.getreportbyid('1005')
    end;
    else if @uid<>0
    begin
        if @uisactivated =0
        begin
            select dbo.getreportbyid('1002')
        end;
        else if @uisdeleted = 1
        begin
            select dbo.getreportbyid('1003')
        end;
    end;
    else
    begin
        select ('successful') as report
    end;
    return
end;
4

3 回答 3

6

问题是这些行:

...
RETURNS TABLE
AS
...

这对于四种类型的用户定义函数中的任何一种都不是有效的语法。

假设您正在尝试定义一个多语句表值函数,它应该如下所示:

...
RETURNS @YourTableName TABLE( <column-definitions>... )
AS
...

然后你的函数语句应该在它执行RETURN语句之前将函数返回数据放入该表中,它也没有这样做。

于 2012-12-16T15:18:19.533 回答
3

您的问题是您混合了多语句表值函数和内联表值函数的语法。有关每个和一些性能注意事项的示例,请查看我的帖子:http: //sqlity.net/en/498/t-sql-tuesday-24-prox-n-funx/

简而言之,如果你想在一个表值函数中使用多个语句,你必须在 RETURNS 关键字之后声明一个表变量,并在函数体中插入你想要返回的行。但是,这种类型的功能具有严重的性能影响,您应该尽量远离它。

除此之外,您的 BEGIN 和 END 似乎不匹配。正如 Barry 所说,“在这里稍微缩进会大有帮助”,可以帮助您和其他人更好地理解您的代码。

于 2012-12-16T15:21:56.473 回答
0

你不能有;在 if 命令结束之前。空值检查也是错误的。例如;

if @uid <> null -- (1) note: should be if @uid is not null
Begin
    -- query
End;     --(2)-Note: this is wrong 
Else 
Begin
    --Query
End
于 2012-12-16T15:26:37.497 回答