通过存储过程向SQL插入数据后返回一个字符串

2 人关注

我是SQL的新手,第一次创建存储过程。

我应该插入数据并得到一个返回字符串。返回值应该是 成功插入 ,或者如果失败,应该通知我是否有一个 用户名 已经存在......或者类似的东西,但是

我被困在 错误的 代码中

因此,这里是我的代码。

Create Proc Mock_InsertUser 
@Username varchar(20),
@Password varchar(100), 
@fullName varchar(60),
@Activated bit, 
@Suspended bit 
Begin
DECLARE
@Error INT,
    @rowcount INT,
    @log varchar(1000)
IF EXISTS(SELECT username FROM Users_mock WHERE username = @Username)
BEGIN
SET @log = 'Username ' + @Username + ' already exists.'
    GOTO ERROR  
Insert into Users_mock 
  (username, [password], full_name, Activated, Suspended)
values 
  (@Username, @Password, @fullName, @Activated, @Suspended)
SELECT @Error = @@ERROR, @rowcount = @@ROWCOUNT
--if there is an error OR If row is not inserted..
IF @Error <> 0 OR @rowcount < 1
BEGIN
SET @log = 'Failed to Insert Account.'
   GOTO ERROR
-----------------------------------------------------------
Error:
--Some code here

对不起,我的问题很蹩脚 :)

1 个评论
SQL 只是 结构化查询语言 --许多数据库系统使用的语言,但不是数据库产品......许多东西是特定于供应商的--所以我们真的需要知道你使用的是什么 数据库系统 (以及哪个版本)....
sql
sql-server-2008
stored-procedures
Emmanuel Gabion
Emmanuel Gabion
发布于 2012-12-13
2 个回答
marc_s
marc_s
发布于 2012-12-13
已采纳
0 人赞同

你为什么不使用这样的东西。

CREATE PROCEDURE dbo.Mock_InsertUser
       (@Username VARCHAR(20),
        @Password VARCHAR(100),
        @fullName VARCHAR(60),
        @Activated BIT,
        @Suspended BIT )
BEGIN
BEGIN TRY
       DECLARE @Error INT, @rowcount INT, @log VARCHAR(1000)
       -- check if user exists    
       IF EXISTS (SELECT * FROM dbo.Users_mock WHERE username = @Username) 
       BEGIN
-- yes - just define the response message
SET @log = 'Username ' + @Username + ' already exists.'
ELSE BEGIN
-- doesn't exist - insert data
INSERT INTO 
              dbo.Users_mock(username, [password], full_name, Activated, Suspended)
          VALUES
              (@Username, @Password, @fullName, @Activated, @Suspended)
          -- set response message
SET @log = 'Username ' + @Username + ' successfully inserted.'
END TRY
    BEGIN CATCH
       -- handle exceptions - you can access error details here, too, if you need to
SET @log = 'Some really weird error happened.'
END CATCH  
    -- return the message back to the caller    
SELECT @Log

要看的点。

  • 使用BEGIN TRY/END TRY - BEGIN CATCH/END CATCH像C#一样处理异常- 不需要不断检查@@ERROR值 ....

  • 基本上只是检查用户是否存在--相应地设置@Log消息。如果用户不存在,就插入它并将@Log消息设置为 "成功"

  • 不需要标签、GOTO和其他类似的东西....

  • Captain Kenpachi
    Captain Kenpachi
    发布于 2012-12-13
    0 人赞同

    使用ELSE关键字。

    IF EXISTS(SELECT username FROM Users_mock WHERE username = @Username)
    BEGIN
    SET @log = 'Username ' + @Username + ' already exists.'
    SELECT @log --this end the stored procedure. it is like the return keyword.
    BEGIN
    Insert into Users_mock 
        (username, [password], full_name, Activated, Suspended)
        values 
        (@Username, @Password, @fullName, @Activated, @Suspended)
        DECLARE @Error = @@ERROR
    DECLARE @rowcount = @@ROWCOUNT
    --if there is an error OR If row is not inserted..
        IF @Error <> 0 OR @rowcount < 1
    BEGIN