简单的SQL UPDATE在控制台中工作,但不作为存储过程

时间:2018-05-04 02:05:42

标签: sql-server stored-procedures sql-server-2012 sql-update

我知道这是一个非常简单的SQL例程,所以我很困惑为什么它实际上没有更新。

这些完全靠自己工作:

class HumanClassification:
    def __init__(self):
        self.age = 0
        self.height = 0
        self.gender = []
    def classification(self, age, height, gender):
        self.age = age
        self.height = height
        self.gender = gender

bob = HumanClassification.classification(32, 6, 'male')
print (bob.age)

但是当我尝试将它们变成存储过程时,它们似乎没问题并执行正常,但没有更新。

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

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

我相信我一定错过了什么?

感谢您的关注。

3 个答案:

答案 0 :(得分:0)

您尚未指定参数的长度

@DealerCode VARCHAR

所以默认情况下,它采用VARCHAR(1)。您可以在程序中打印或选择@DealerCode来检查相同的内容。

答案 1 :(得分:0)

来自您的查询

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

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

我认为经销商代码类型是数字,因为您没有在12345上放置(' ...'),您可以尝试这个我对其进行一些修改的查询

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;  

答案 2 :(得分:0)

在没有看到整个过程的情况下很难,因为底部有一个END TRY而没有BEGIN TRY,所以你的语句甚至可能都没有执行,因为执行会跳转到{ {1}}。还要确保在没有提交的情况下没有开始交易。

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

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

VARCHAR

如果此方法有效,请删除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使用相应的RAISERROR捕获。例如:

ERROR_MESSAGE()