【问题标题】:SQL SERVER: Altering service broker stored proceduresSQL SERVER:更改服务代理存储过程
【发布时间】:2014-05-21 14:18:43
【问题描述】:

我无法更改服务代理存储过程,当我更新存储过程时,它不会显示任何错误并成功更新,但更改不会生效。

是因为我需要在更改生效之前停止两个数据库上的服务代理队列吗?

注意:服务代理存储过程产生和读取 xmls。

包括存储过程

ALTER PROCEDURE [dbo].[ServiceBroker_AtTarget_FromSLICJobEstimateDetailsNewLineAddedBySupplier]
    @XML XML(SLICMessageSchema)
AS
BEGIN
    -- extract data :
    DECLARE     
    @LogNo              INT,
    @QuoteReference         INT,
    @JobEstimatesDetailID       INT,
    @UserName           NVARCHAR(50),
    @Description            NVARCHAR(MAX),
    @UnitValue          DECIMAL(18,2),
    @Quantity           DECIMAL(18,2),
    @LineTotal          DECIMAL(18,2),
    @QuoteTotal         DECIMAL(18,2),
    @tsCreated          DATETIME

    SELECT      @QuoteReference = @XML.value('data(//FromSLIC/FromSLICJobEstimateDetailsNewLineAddedBySupplier/@QuoteReference)[1]', 'int'),
            @JobEstimatesDetailID = @XML.value('data(//FromSLIC/FromSLICJobEstimateDetailsNewLineAddedBySupplier/@JobEstimatesDetailID)[1]', 'int'),    
            @UserName = @XML.value('data(//FromSLIC/FromSLICJobEstimateDetailsNewLineAddedBySupplier/@UserName)[1]', 'nvarchar(50)'),
            @Description = @XML.value('data(//FromSLIC/FromSLICJobEstimateDetailsNewLineAddedBySupplier/@Description)[1]', 'nvarchar(max)'),
            @UnitValue = @XML.value('data(//FromSLIC/FromSLICJobEstimateDetailsNewLineAddedBySupplier/@UnitValue)[1]', 'decimal(18,2)'),
            @Quantity = @XML.value('data(//FromSLIC/FromSLICJobEstimateDetailsNewLineAddedBySupplier/@Quantity)[1]', 'decimal(18,2)'),      
            @tsCreated = @XML.value('data(//FromSLIC/FromSLICJobEstimateDetailsNewLineAddedBySupplier/@tsCreated)[1]', 'datetime')

    SET @LogNo = (SELECT mlq.logno FROM fsgmgtservices.dbo.maintlogquotes mlq WHERE mlq.quoteno = @QuoteReference)

    INSERT INTO fsgcentraldata.dbo.[tblSLICGeneratedEvents]
    (EventNameID, tsCreated, CreatedBy, IsAcknowledged, JobNumber, ContractorID)
    SELECT 9, @tsCreated, @UserName, 0, @LogNo, je.contractorid
    FROM [slic3.0].dbo.JobEstimates je WHERE je.legacyreference = CAST(@quotereference AS varchar(50))



SET @LineTotal = (@UnitValue * @Quantity) // IF I CHANGE IT TO ((@UnitValue * 2)) FOR EXMPL



    INSERT INTO fsgmgtservices.dbo.maintlogquotedetails
    (quoteno, details, quantity, rate, amount, [date], slicreference)
    SELECT @QuoteReference, @description, @quantity, @UnitValue, @LineTotal, @tscreated, @JobEstimatesDetailID

    SET @QuoteTotal = (SELECT SUM(mlqd.amount) FROM fsgmgtservices.dbo.maintlogquotedetails mlqd 
    WHERE mlqd.quoteno = @QuoteReference)

    UPDATE fsgmgtservices.dbo.maintlogquotes SET amount = @QuoteTotal WHERE quoteno = @QuoteReference   

    INSERT INTO [fsgmgtservices].[dbo].maintlognotes
    (logno, [date], [user], [note], transferredfromslic)
    SELECT @LogNo, @tsCreated, @UserName, 'Quote ' + CAST(@QuoteReference AS varchar(20)) + ', new lines added by supplier in SLIC By ' + @UserName , 0

END

【问题讨论】:

  • 使用sp_helptext 来验证ALTER 确实被占用了。或者您可能正在查看错误的数据库。

标签: sql sql-server service-broker


【解决方案1】:

更改已激活的存储过程不会杀死任何正在运行的实例。很可能您的旧代码仍在循环中运行,并将继续运行,直到它退出循环或您将其终止。

【讨论】:

  • 嗨 Remus,我等待队列中的所有作业都已完成,然后才禁用队列,然后修改了 SP。我运行了以下命令,它说 0. select p.rows from sys.objects as o join sys.partitions as p on p.object_id = o.object_id join sys.objects as q on o.parent_object_id = q.object_id where q .name = 'queuename' 和 p.index_id = 1
  • 在 sp_helptext 中没有考虑存储过程显示为由更新编辑。请注意,涉及的两个数据库都具有相同的事件和目标存储过程
  • 服务代理程序 1. 不带参数 2. 必须发出RECEIVE。你必须阅读Service Broker Programming Concepts
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
相关资源
最近更新 更多