【问题标题】:add custom messages in a stored procedure在存储过程中添加自定义消息
【发布时间】:2014-11-17 12:31:12
【问题描述】:

我想根据 if else 条件在我的存储过程中添加一些消息,我该怎么做。问题是我有三个表团队、帐户和用户。我只想在没有任何帐户且用户与该团队相关的情况下删除团队表中的 teamA。我有运行良好的存储过程,但我想检查条件并想使用 if else 添加一些自定义消息。请帮助这是我的代码。

Create PROCEDURE sp_DeleteTeam

@pTeamId int
 AS
BEGIN

    SET NOCOUNT ON;

   update t
   set t.Deleted =1
   from Team t
   where t.TeamId = @pTeamId
   And Not Exists (Select 1 from [User] where TeamId = @pTeamId)

   And Not Exists (Select 1 from Account where TeamId = @pTeamId)
END

【问题讨论】:

  • 请不要在存储过程中使用 sp_ 前缀为其系统默认过程名称前缀。
  • @Rajesh 谢谢你的信息。我没有在我的查询中使用这个前缀。为了更好地理解,我在这里提到了它。

标签: sql-server stored-procedures sql-server-2008-r2


【解决方案1】:

不要为用户存储过程使用前缀 sp_,因为它是为系统过程保留的。

以下是使用 RAISERROR 返回消息的示例。本例中的 11 或更高的严重性将在应用程序中引发异常。 10 或更低的严重性将生成一条信息性消息。

CREATE PROCEDURE usp_DeleteTeam @pTeamId int
AS
    BEGIN

        SET NOCOUNT ON;
        DECLARE @Message varchar(2047);

        UPDATE  t
        SET     t.Deleted = 1
        FROM    Team t
        WHERE   t.TeamId = @pTeamId
                AND NOT EXISTS ( SELECT 1
                                 FROM   [User]
                                 WHERE  TeamId = @pTeamId )
                AND NOT EXISTS ( SELECT 1
                                 FROM   Account
                                 WHERE  TeamId = @pTeamId );

        IF @@ROWCOUNT = 0
            BEGIN
                IF NOT EXISTS ( SELECT  *
                                FROM    Team
                                WHERE   TeamId = @pTeamId )
                    BEGIN
                        SET @Message = 'does not exist in Team table';
                    END;
                IF EXISTS ( SELECT  *
                            FROM    [User]
                            WHERE   TeamId = @pTeamId )
                    BEGIN
                        SET @Message = COALESCE(@Message + ', ', '')
                            + 'already exists in User table';
                    END;
                IF EXISTS ( SELECT  *
                            FROM    Account
                            WHERE   TeamId = @pTeamId )
                    BEGIN
                        SET @Message = COALESCE(@Message + ', ', '')
                            + 'already exists in Account table';
                    END;
                SET @Message = 'Team %d: ' + @Message
                RAISERROR(@Message, 11, 0, @pTeamId);
            END;
    END;

【讨论】:

  • 嗨先生,我怎样才能设置像 t.Deleted = 1, t.LastUpdatedOn = getDate(), t.LastUpdatedBy = ????来自团队 t,我希望 lastUpdatedBy 列填充用户表中的 UserId,到目前为止我已经尝试过 Deleted = 1,LastUpdatedOn = GetDate(),LastUpdatedBy = 1“我已将此值硬编码”“请帮助跨度>
  • 您提到您想要 User 表中的 LastUpdatedBy 值,但只有 TeamId 不在该表中时才会发生 UPDATE。我建议您发布另一个带有CREATE TABLE 语句、示例数据和预期结果的问题。
【解决方案2】:

使用下面的 SP 来使用打印或选择消息。

Create PROCEDURE sp_DeleteTeam

@pTeamId int
 AS
BEGIN
    SET NOCOUNT ON;

   IF ((NOT EXISTS (SELECT TOP 1 FROM [User] WHERE TeamId = @pTeamId)) AND (Not EXISTS (SELECT TOP 1 FROM Account WHERE TeamId = @pTeamId)))
   BEGIN
     UPDATE T
     SET T.Deleted = 1
     FROM Team t
     WHERE T.TeamId = @pTeamId

     SELECT 'Not exist - Table updated' AS Message
     --PRINT 'Not exist - Table updated'
   END
  ELSE 
  BEGIN
    SELECT 'Already exist - Table not updated.' AS Message
    --PRINT 'Already exist - Table not updated.'
  END
END

【讨论】:

  • 嗨先生,我怎样才能设置像 t.Deleted = 1, t.LastUpdatedOn = getDate(), t.LastUpdatedBy = ????来自团队 t,我希望 lastUpdatedBy 列填充用户表中的 UserId,到目前为止我已经尝试过 Deleted = 1,LastUpdatedOn = GetDate(),LastUpdatedBy = 1“我已将此值硬编码”“请帮助跨度>
【解决方案3】:

据我了解,您只是想看看它是否成功执行。如果在某个应用程序中调用了存储过程,最后,给出一个 select 语句为

SELECT 'Your message' AS Message

然后在应用程序中将结果存储在数据集中并检索您的消息,

如果您没有在任何应用程序中使用它,那么只需使用

print 'your message'

或者可能会尝试更具体并更清楚地阐述您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多