2009-10-02 46 views
0

我們有一個C#應用程序發佈到複製到另一個數據庫(使用合併複製)的數據庫,並且有一個自定義解析器是存儲過程。複製自定義解析器將空字符串更改爲NULL

這在SQL Server 2000下工作正常,但在SQL Server 2005下測試時,自定義解析器試圖將任何空的varchar列更改爲空(並且失敗,因爲此特定列不允許爲空)。

請注意,這些varchar字段不是那些會導致衝突的字段,因爲它們在兩個數據庫上都是空的,並且沒有更改,存儲過程也不會更改它們(它所做的只是試圖設置另一個錢欄)。

有沒有人遇到過這個問題,或者有一個存儲過程的例子,會留下空字符串,因爲它們是?

實際的存儲過程相當簡單,並在發生衝突時重新計算客戶餘額。

ALTER procedure [dbo].[ReCalculateCustomerBalance] 
    @tableowner sysname, 
    @tablename sysname, 
    @rowguid varchar(36), 
    @subscriber sysname, 
    @subscriber_db sysname, 
    @log_conflict INT OUTPUT, 
    @conflict_message nvarchar(512) OUTPUT 
AS 
    set nocount on 
DECLARE 
    @CustomerID bigint, 
    @SysBalance money, 
    @CurBalance money, 
    @SQL_TEXT nvarchar(2000) 

    Select @CustomerID = customer.id from customer where rowguid= @rowguid 

    Select @SysBalance = Sum(SystemTotal), @CurBalance = Sum(CurrencyTotal) From CustomerTransaction Where CustomerTransaction.CustomerID = @CustomerID 

    Update Customer Set SystemBalance = IsNull(@SysBalance, 0), CurrencyBalance = IsNull(@CurBalance, 0) Where id = @CustomerID 

    Select * From Customer Where rowguid= @rowguid 

    Select @log_conflict =0 
    Select @conflict_message ='successful' 
    Return(0) 
+0

你可以發佈你的存儲過程的問題部分?這聽起來並不熟悉,但2000年或2005年可能會有問題,如果我們看到您的存儲過程將會突出顯示。 – Erich 2009-10-05 15:25:23

+0

我已經包含了整個存儲過程,因爲它相當短。 但是,如果我刪除前兩個選擇並用類似於以下內容替換更新,則會發生相同的錯誤:更新客戶設置SystemBalance = 0其中rowguid = @rowguid – sgmoore 2009-10-05 15:50:58

+0

拋出的錯誤究竟是什麼?它是一個SQL錯誤,或者在C#某處? '問題'字段是什麼字段? 我沒有看到任何情況下,除了通過Select *語句,它可以通過任何東西返回空值。我能想出的唯一方法就是如果記錄不存在。 你可以嘗試命名select中的列,或者讓你在哪裏id = @ customerId? – Erich 2009-10-05 15:55:17

回答

0

這裏有幾個選項,每個都是從我的研究似乎顯示是SQL Server問題的一種解決方法。

1-改變這樣的說法:Select * From Customer Where rowguid= @rowguid明確提及每一列,並使用一個「參考isNull」對於違規的領域

2 - 改變在表中的列添加一個默認約束爲「」。這將做什麼,如果你試圖插入一個'空',它將用空字符串代替它

3-添加'before insert'觸發器,它將在插入之前更改數據,不包含'null'

PS:您肯定複製系統將該列標記爲「必需」嗎?我認爲如果不需要,如果沒有數據存在,它會插入'空'。

+0

感謝您的建議。我可能需要一段時間才能解決所有問題。 我嘗試了一個2的變體,其中我實際上爲字母a設置了默認約束(以便更容易查看它的應用時間)。 在這種情況下,空字符串仍被替換爲null。 我不確定我是否理解您所要求的列的含義。它肯定包含在複製中。如果這不是你的意思,我該如何檢查'所需'的狀態? – sgmoore 2009-10-05 20:08:15

+0

我不確定,在搜索SQL複製時我注意到了它。顯然,有一些設置可以讓你說出是否需要。 – Erich 2009-10-05 20:49:37

+0

建議1沒有任何區別。在執行存儲過程的階段,任何地方都沒有空值。 沒有3似乎更有希望。雖然這是微軟Sql(據我所知)沒有'插入前'這樣的事情。我將不得不更多地閱讀'而不是'觸發器(我之前沒有用過)。但是暫時允許空值並添加更新後觸發器允許我將空字符串返回。 這是否工作取決於是否有任何允許空值的列,但將它們視爲與空字符串不同的含義。 – sgmoore 2009-10-06 09:38:29