首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单的SQL更新在控制台中工作,但不作为存储过程工作。

简单的SQL更新在控制台中工作,但不作为存储过程工作。
EN

Stack Overflow用户
提问于 2018-05-04 02:05:42
回答 3查看 224关注 0票数 0

我知道这是一个非常简单的SQL例程,所以我对它为什么不实际更新感到困惑。

这些工作完全靠自己:

代码语言:javascript
运行
复制
UPDATE ourwebsite.dbo.dealer 
SET Active = 0
WHERE  dealercode = 12345

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  dealercode = 12345

但是,当我试图将它们变成存储过程时,它们看起来是正常的,并执行ok,但是没有任何更新。

代码语言:javascript
运行
复制
@DealerCode VARCHAR
AS
SET NOCOUNT ON;
UPDATE ourwebsite.dbo.dealer 
SET Active = 0
WHERE  DealerCode = @DealerCode

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  DealerCode = @DealerCode 
END TRY

我肯定我错过了什么?

感谢您的关注。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-04 03:21:58

您没有为参数指定长度。

代码语言:javascript
运行
复制
@DealerCode VARCHAR

因此,默认情况下,它作为VARCHAR(1)。您可以在您的过程中打印或选择@解除警报代码以检查该代码。

票数 0
EN

Stack Overflow用户

发布于 2018-05-04 06:33:39

从你的疑问

代码语言:javascript
运行
复制
UPDATE ourwebsite.dbo.dealer 
SET Active = 0
WHERE  dealercode = 12345

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  dealercode = 12345

我认为经销商代码类型是数字类型,因为您没有将(‘.’)在12345上,您可以尝试一下我对它做了一些修改的查询。

代码语言:javascript
运行
复制
AS @DealerCode NUMERIC

BEGIN TRANSACTION

BEGIN TRY  
    SET NOCOUNT ON;
    UPDATE ourwebsite.dbo.dealer 
    SET Active = 0
    WHERE  DealerCode = @DealerCode

    UPDATE ourwebsite.dbo.reps 
    SET username = username + '_LR-3.0'
    WHERE  DealerCode = @DealerCode 

    -- Commit the updates into the table
    COMMIT TRANSACTION

END TRY  
BEGIN CATCH  

    -- Execute rollback upon error retrieval routine.  
    ROLLBACK TRANSACTION 

END CATCH;  
票数 0
EN

Stack Overflow用户

发布于 2018-05-04 07:03:12

如果不查看整个过程是很困难的,因为底部有一个没有END TRYBEGIN TRY,所以您的语句甚至可能不会被执行,因为执行会跳转到CATCH。此外,请确保没有提交事务就不会启动事务。

除此之外,手动查询与过程(即@DealerCode数据类型)之间存在差异。在手动查询中是一个INT (或数字),而在SP中,它是一个未声明长度的VARCHAR。从您的dealercode表中检查哪个数据类型是您的ourwebsite.dbo.reps列,并确保您的变量是相同的类型。还始终指示VARCHAR字段的长度。

测试以下代码,它将更新您的记录,因为它与独立查询相同:

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.TestUpdate
    @dealercode INT
AS
BEGIN

    UPDATE ourwebsite.dbo.dealer 
    SET Active = 0
    WHERE  dealercode = @dealercode

    UPDATE ourwebsite.dbo.reps 
    SET username = username + '_LR-3.0'
    WHERE  dealercode = @dealercode

END

如果这样做有效,可以移除BEGIN TRY . END TRY和整个CATCH以查看所获得的错误,或者确保在捕获时使用相应的ERROR_MESSAGE()执行RAISERROR。示例:

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.YourProcedure
    @dealercode VARCHAR(20)
AS
BEGIN

    BEGIN TRY

        -- Your operations here
        SELECT 1 / 0

    END TRY

    BEGIN CATCH

        DECLARE @v_ErrorMessage VARCHAR(MAX) = CONVERT(VARCHAR(MAX), ERROR_MESSAGE())

        -- Rollback if you have to

        RAISERROR (@v_ErrorMessage, 16, 1)

    END CATCH

END
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50166135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档