2016-11-08 63 views
1

所以是。我有這個奇怪的問題。我有以下存儲過程存儲過程僅在管理工作室運行時更新

ALTER PROCEDURE [CP24SHOP].[sp_part_set_status_bulk] 
    @user     nvarchar(max), 
    @doerTicket    VARCHAR (200) = null, 
    @status     int, 
    @items     CP24SHOP.udt_parts READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 
     -- Check security 
     exec websocket.sp_validate_user 
      @user, 
      @doerTicket out 

     -- foreach row in @items, update the status 
     MERGE INTO [file].ItemPart WITH (XLOCK, ROWLOCK) AS target 
     USING (SELECT 
        item.GID   
       FROM @items AS item 
      ) AS source 
     ON (target.GID = source.GID) 
     WHEN MATCHED THEN 
      UPDATE SET 
       target.[Status] = @status, 
       target.DateTimeModified = GETDATE(); 

     select 'bob' 
    RETURN 0 
END 

;當我從Management Studio中使用此代碼

declare @user nvarchar(max) = 'websocket' 

     DECLARE @list CP24SHOP.udt_parts 
     INSERT INTO @list 
     (
      GID 
     ) 
     VALUES 
     (
      -7228376 
     ) 

     select [Status] from [file].ItemPart 
     where GID = -7228376 

     exec CP24SHOP.sp_part_set_status_bulk 
      @user = @user, 
      @items = @list, 
      @status = '155' 

     select [Status], DateTimeModified from [file].ItemPart 
     where GID = -7228376 

運行它,它更新了status沒有問題

但通過我們的WebSocket調用它時它運行該代碼並返回「bob」,因爲它應該,但是當我檢查數據庫時,該項目的狀態沒有更新。我很無知,可能是錯誤的

+1

輕微彎路,而不是對問題的答案。但是你應該考慮不使用sp_前綴(或者甚至沒有更好的前綴)。 sp_前綴可能會導致性能問題以及其他一些隱藏的寶石。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+0

我沒有意識到這一點,非常感謝你在我的測試^^ –

回答

1

錯誤 - 我想你錯過了一個提交。 在我看來,你正在更新&然後回滾!

+0

是的,但不是從我們的websocket ;-) –

+0

我已經取消了回滾,因爲它似乎造成了比應該更多的混亂。當代碼如上所示運行時,同樣的問題發生在 –

+1

之上。嗯 - websocket.sp_validate_user會失敗嗎?有時候我看到某些Web框架(例如NHibernate)有自己的包裝事務,它們會自動爲任何SQL調用添加提交/回滾 - 如果可能的話,我會嘗試在Websocket調用上運行跟蹤。 –

相關問題