2012-11-08 28 views
0

我有一個更新觸發器SQL觸發器是更新隨機行不加入行

UPDATE [FSSQLPROD01].[collectionsDELETE].[dbo].[collections] 
SET 
    Defendant_1 = i.DisplayName 
    , Loan_Number_1 = i.Comments 
    , Client = i.KS_BookName 
    , Date_Instructed = i.OpenDate 
    , Person_Responsible_name = i.ResponsibleFeeEarnerName 
    , Person_Responsible_Email = i.ResponsibleFeeEarnerEmail 
    , Person_Acting_name = i.BillingFeeEarnerName 
    , Person_Acting_email = i.BillingFeeEarnerEmail 
    , Agent_Acting_name = i.BillingFeeEarnerName 
    , Agent_Acting_email = i.BillingFeeEarnerEmail 
    , CBA_Panel_Service_Area = i.KS_ServiceCat 
    , HBN_Number = i.KS_ClientAcctRef 
    , St_George_Contact = i.KS_Instructor 
FROM 
    [FSSQLPROD01].[collectionsDELETE].[dbo].[collections] c 
INNER JOIN 
    Inserted i 
ON 
    Left(c.file_number, 6) COLLATE DATABASE_DEFAULT = i.MatterNumber COLLATE DATABASE_DEFAULT 

enter image description here 此查詢現在加入連接上File_Number例如相匹配70003-1,但由於某些未知的原因,應更新到此行的數據已更新爲隨機行614864-7

我可以繼續執行觸發器和特林更新70003-1行,但我繼續更新其他行614864-7

這也跨鏈接服務器的觸發是一個服務器最多約會其他服務器

服務器跳跳虎坐在Microsoft SQL Server上運行2005 - 9.00.3042.00(X64 )Feb 10 2007 00:59:02 Copyright(c)1988-2005 Windows NT 5.2(Build 3790:Service Pack 2)上的Microsoft Corporation企業版(64位)

服務器觸發器正在更新Microsoft SQL Server 2005 - 9.00.3042.00(X64)Feb 10 2007 00:59:02 Copyright(c)1988-2005 Windows NT 5.2上的Microsoft Corporation企業版(64位)(內部版本3790:服務包2)

我一直在想,更新服務器SP到SP4可能會解決這個問題?

有誰有振振有辭,爲什麼這可能haapening服務器

Ammendment

是啊,我居然硬編碼值,並簡化了SQL語句它的作品,因爲它應該

DECLARE @MatterNumber as varchar(50) 
SET @MatterNumber = (SELECT i.MAtternumber FRom Inserted as i) + '-1' 
Print @MatterNumber 

UPDATE [FSSQLPROD01].[collectionsDELETE].[dbo].[collections] 
     SET Loan_Number_1 = ‘123’ 
     WHERE file_number = @MatterNumber 

但作爲立即將聲明的變量值設置爲Loan_Number_1或任何其他列,這是問題開始發生時的情況。

DECLARE @LoanNumber as varchar(50) 
SET @LoanNumber = (SELECT i.Comments FRom Inserted as i) 
    Print @LoanNumber 
DECLARE @MatterNumber as varchar(50) 
SET @MatterNumber = (SELECT i.MAtternumber FRom Inserted as i) + '-1' 

Print @MatterNumber –-I print here I see 70003-1 

UPDATE [FSSQLPROD01].[collectionsDELETE].[dbo].[collections] 
     SET Loan_Number_1 = @LoanNumber 

     WHERE file_number = @MatterNumber 

Print @MatterNumber –-I print here I see 70003-1 
+1

我非常懷疑這是SQL服務器本身的一個問題 - 很可能是你的觸發代碼有錯誤 – Charleh

+0

我同意Charleh。爲什麼不嘗試一些不同的東西來隔離問題,如下所示:1.對觸發器進行硬編碼,看看它是否按預期運行2.將插入的表格寫入另一個表格,然後進行檢查。你知道如果你更新了那一行,觸發器將被插入表中的多行調用? –

+0

我已經推薦了我的任務,以展示我如何硬編碼以及向我展示了什麼 –

回答

-4

觸發器用於在單個記錄上進行更新。當我們進行批量插入/更新時,他們不工作。 因爲SQL Server triggers runs only 1 time per UPDATE. 如果您在單個語句中修改3000行,您的觸發器將不會觸發3000次。你的觸發器只會觸發一次。所以這就是它更新隨機行的原因(儘管它應該是第一行)。

+0

這完全是絕對虛假的 – Lamak

+1

其實它其實是最真實的。如果我運行一次更新並更新3000行,觸發器將觸發一次,而INSERTED將有3000行。這可能也可能不是爲什麼更新似乎是隨機的。 –

+4

@ElectricLlama足夠公平,這是答案的唯一正確部分。 *觸發器用於在單個記錄上更新*是錯誤的,它們不適用於更新或插入多條記錄是錯誤的,「更新隨機行並且應該是第一條」是錯誤的。總的來說,這個答案是錯誤的 – Lamak

0
UPDATE [FSSQLPROD01].[collectionsDELETE].[dbo].[collections] 
SET 
    Defendant_1 = i.DisplayName 
    , Loan_Number_1 = i.Comments 
    , Client = i.KS_BookName 
    , Date_Instructed = i.OpenDate 
    , Person_Responsible_name = i.ResponsibleFeeEarnerName 
    , Person_Responsible_Email = i.ResponsibleFeeEarnerEmail 
    , Person_Acting_name = i.BillingFeeEarnerName 
    , Person_Acting_email = i.BillingFeeEarnerEmail 
    , Agent_Acting_name = i.BillingFeeEarnerName 
    , Agent_Acting_email = i.BillingFeeEarnerEmail 
    , CBA_Panel_Service_Area = i.KS_ServiceCat 
    , HBN_Number = i.KS_ClientAcctRef 
    , St_George_Contact = i.KS_Instructor 
FROM 

    Inserted i 
where 
    Left([FSSQLPROD01].[collectionsDELETE].[dbo].[collections] .file_number, 6) COLLATE DATABASE_DEFAULT = i.MatterNumber COLLATE DATABASE_DEFAULT 
+0

沒有沒有工作,它也不會允許[FSSQLPROD01]。[collectionsDELETE]。[dbo]。[收藏]在左側功能 –

+0

感謝您嘗試Bummi –