我們有一個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)
你可以發佈你的存儲過程的問題部分?這聽起來並不熟悉,但2000年或2005年可能會有問題,如果我們看到您的存儲過程將會突出顯示。 – Erich 2009-10-05 15:25:23
我已經包含了整個存儲過程,因爲它相當短。 但是,如果我刪除前兩個選擇並用類似於以下內容替換更新,則會發生相同的錯誤:更新客戶設置SystemBalance = 0其中rowguid = @rowguid – sgmoore 2009-10-05 15:50:58
拋出的錯誤究竟是什麼?它是一個SQL錯誤,或者在C#某處? '問題'字段是什麼字段? 我沒有看到任何情況下,除了通過Select *語句,它可以通過任何東西返回空值。我能想出的唯一方法就是如果記錄不存在。 你可以嘗試命名select中的列,或者讓你在哪裏id = @ customerId? – Erich 2009-10-05 15:55:17