Sql server 简单SQL更新在控制台中工作,但不作为存储过程
我知道这是一个非常简单的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 但是,当我试图将它们转换为存储过程时,它们看起来正常,执行正常,但没有任何更新
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
,以查看是否捕捉到错误,但不报告它。您可能还应该发布用于调用它的脚本