我知道这是一个非常简单的SQL例程,所以我对它为什么不实际更新感到困惑。
这些工作完全靠自己:
UPDATE ourwebsite.dbo.dealer
SET Active = 0
WHERE dealercode = 12345
UPDATE ourwebsite.dbo.reps
SET username = username + '_LR-3.0'
WHERE dealercode = 12345但是,当我试图将它们变成存储过程时,它们看起来是正常的,并执行ok,但是没有任何更新。
@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我肯定我错过了什么?
感谢您的关注。
发布于 2018-05-04 03:21:58
您没有为参数指定长度。
@DealerCode VARCHAR因此,默认情况下,它作为VARCHAR(1)。您可以在您的过程中打印或选择@解除警报代码以检查该代码。
发布于 2018-05-04 06:33:39
从你的疑问
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; 发布于 2018-05-04 07:03:12
如果不查看整个过程是很困难的,因为底部有一个没有END TRY的BEGIN TRY,所以您的语句甚至可能不会被执行,因为执行会跳转到CATCH。此外,请确保没有提交事务就不会启动事务。
除此之外,手动查询与过程(即@DealerCode数据类型)之间存在差异。在手动查询中是一个INT (或数字),而在SP中,它是一个未声明长度的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以查看所获得的错误,或者确保在捕获时使用相应的ERROR_MESSAGE()执行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
ENDhttps://stackoverflow.com/questions/50166135
复制相似问题