4

テーブルにエントリを追加する SQL 関数を作成しようとしています。新しいユーザーを追加する前に、確認したいこと、またはこのユーザーがまだテーブルにないことを確認します。コードを書きましたが、次のエラーが表示されて保存できません: 関数内での副作用演算子 'INSERT' の使用が無効です。関数内に含まれる最後のステートメントは、return ステートメントでなければなりません。

CREATE FUNCTION [dbo].[CreateUser]
    (
    @Username varchar(20),
    @Password varchar(20),
    @Email varchar(50),
    @PasswordQuestion varchar(30),
    @PasswordAnswer varchar(30)

    )
RETURNS bit/* datatype */
AS
    BEGIN
        if  (Exists(Select Username from Users where Username=@Username and Password=@Password))
            return 1;
        else
            begin
                INSERT INTO dbo.Users (Username, Password, 
                                       Email, UserId, 
                                       IsApproved, IsLockedOut, 
                                       IsOnline, CreationDate, 
                                       PasswordQuestion, PasswordAnswer) VALUES (@Username, @Password, @Email, 
                                                                                 1, 0, 0, 0, GetDate(), 
                                                                                 @PasswordQuestion, @PasswordAnswer);
                return 0;
            end

    END

私はSQLの初心者なので、アドバイスは素晴らしいです!

4

1 に答える 1

7

つまり、関数は SQL Server オブジェクトを変更することはできません。ストアド プロシージャは可能です。マイナーな変更により、コードは SP になりました。

CREATE PROC [dbo].[CreateUser]
    (
    @Username varchar(20),
    @Password varchar(20),
    @Email varchar(50),
    @PasswordQuestion varchar(30),
    @PasswordAnswer varchar(30)

    )
--RETURNS bit/* datatype */
AS
    BEGIN
        if  (Exists(Select Username from Users where Username=@Username and Password=@Password))
            return 1;
        else
            begin
                INSERT INTO dbo.Users (Username, Password, 
                                       Email, UserId, 
                                       IsApproved, IsLockedOut, 
                                       IsOnline, CreationDate, 
                                       PasswordQuestion, PasswordAnswer) VALUES (@Username, @Password, @Email, 
                                                                                 1, 0, 0, 0, GetDate(), 
                                                                                 @PasswordQuestion, @PasswordAnswer);
                return 0;
            end

    END
GO

そして、次のように呼び出すことができます:

exec dbo.CreateUser 'Jim', 'Teddy', 'jim@do.not.email', 'Where', 'Here';
于 2013-05-10T01:45:22.957 に答える