你好程序员我正在写一个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;
答案 0 :(得分:5)
问题在于以下几点:
...
RETURNS TABLE
AS
...
对于四种类型的用户定义函数中的任何一种,这都不是有效的语法。
假设您正在尝试定义多语句表值函数,它应该如下所示:
...
RETURNS @YourTableName TABLE( <column-definitions>... )
AS
...
然后你的函数语句应该在函数执行RETURN
语句之前将函数返回数据放入该表中,它也没有这样做。
答案 1 :(得分:3)
您的问题是您正在混合多语句表值函数和内联表值函数的语法。有关每个和一些性能注意事项的示例,请查看我的帖子:http://sqlity.net/en/498/t-sql-tuesday-24-prox-n-funx/
简而言之,如果要在表值函数中使用多个语句,则必须在RETURNS关键字后声明一个表变量,并在函数体中插入要返回的行。但是,这种功能具有严重的性能影响,你应该努力远离它。
除此之外,你似乎有不匹配的BEGIN和ENDs。正如巴里所说的那样,“帮助你和其他人更好地理解你的代码,会有一点点缩进”。
答案 2 :(得分:0)
你不能拥有;在if命令结束之前。 null checing也是错误的。对于前者;
if @uid <> null -- (1) note: should be if @uid is not null
Begin
-- query
End; --(2)-Note: this is wrong
Else
Begin
--Query
End