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
...

これは、4種類のユーザー定義関数のいずれにも有効な構文ではありません。

マルチステートメントのテーブル値関数を定義しようとしているとすると、次のようになります。

...
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が一致していないようです。バリーが言ったように、あなたや他の人があなたのコードをよりよく理解するのを助けるのに「少しのインデントはここで大いに役立つでしょう」。

于 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 に答える