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

Sql server 简单SQL更新在控制台中工作,但不作为存储过程,sql-server,stored-procedures,sql-server-2012,sql-update,Sql Server,Stored Procedures,Sql Server 2012,Sql Update,我知道这是一个非常简单的SQL例程,所以我不明白为什么它实际上没有更新 这些功能完全独立工作: UPDATE ourwebsite.dbo.dealer SET Active = 0 WHERE dealercode = 12345 UPDATE ourwebsite.dbo.reps SET username = username + '_LR-3.0' WHERE dealercode = 12345 但是,当我试图将它们转换为存储过程时,它们看起来正常,执行正常,但没有任何更新

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

这些功能完全独立工作:

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

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  dealercode = 12345
但是,当我试图将它们转换为存储过程时,它们看起来正常,执行正常,但没有任何更新

@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
我肯定我错过了什么


感谢您的关注。

您尚未为参数指定长度

@DealerCode VARCHAR
因此,默认情况下,它取VARCHAR(1)。您可以在过程中打印或选择@DealerCode进行检查。

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

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  dealercode = 12345
我假设dealercode类型是数字的,因为您没有在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;  

看不到整个过程是很困难的,因为底部有一个
END TRY
,没有
BEGIN TRY
,因此您的语句甚至可能无法执行,因为执行跳转到
CATCH
。还要确保在未提交事务之前不会启动事务

除此之外,您的手动查询与您的过程(即
@DealerCode
数据类型)之间存在差异。在手动查询中是
INT
(或数字),而在SP中是长度未声明的
VARCHAR
。检查
ourwebsite.dbo.reps
表中的
dealercode
列的数据类型,并确保变量的类型相同。还应始终指明
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
如果有效,请删除您的
开始尝试
<代码>结束尝试
和您的整个
捕获
以准确查看您得到的错误,或者确保您使用相应的
错误消息()对捕获执行
RAISERROR
。例如:

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

删除结尾。在声明varchar时,请尝试并最好添加一个长度,即varchar(50)
DealerCode
的数据类型是什么?还将
存储过程
查询包含在
开始中。。。结束
如果需要调试,请发布完整的过程。一定要删除任何
尝试CATCH
,以查看是否捕捉到错误,但不报告它。您可能还应该发布用于调用它的脚本