2016-01-07 212 views
2

大約兩週前,一直在過去6個月工作的一些SQL在沒有任何更改的情況下開始拋出一個錯誤。我花了幾天的時間試圖找出發生了什麼事情,但沒有任何意義。最後,我試着在存儲過程(它沒有任何作用)上進行「更改」,然後最終刪除並重新創建它(它確實修復了它)。傳遞給RIGHT函數的長度參數無效

然後,2天前,錯誤回來了,這次即使drop/create也沒有修復它。根據我的IT人員,他們在1.5個月內沒有修補SQL Server,所以沒有任何改變。有沒有人有任何想法或有相同的問題?

這行代碼,在存儲過程:

SELECT LabelText + Data 
FROM CU_FormLayout fl 
    INNER JOIN CU_Data dat ON dat.LayoutId = fl.Id 
    CROSS APPLY (SELECT RIGHT(fl.xLabelText,1) RightChar) ca2 
    CROSS APPLY (SELECT CASE WHEN ASCII(RightChar) BETWEEN 49 AND 57 OR 
           ASCII(RightChar) BETWEEN 65 AND 90 OR 
           ASCII(RightChar) BETWEEN 97 AND 122 
          THEN fl.xLabelText + ': ' 
          ELSE fl.xLabelText + ' ' END LabelText) ca1 

導致此錯誤:

Invalid length parameter passed to the RIGHT function.

正如你看到的,唯一的RIGHT()有一個硬編碼的長度。它怎麼會失效?

順便說一句,這段代碼的重點在於它需要一列中的「標籤」,如果以字母或數字結尾,則添加「:」,然後添加標籤的數據值。其他方面只是在它們之間放置一個空間。

+0

你有沒有機會得到錯誤引發的確切數據('fl.xLabelText')? –

+0

@TT。上面的SQL爲整個表運行它,它不會出錯。 SP中的SQL包含一個'WHERE'子句,它可以爲單個ID執行此操作。無論哪一個我都可以這樣做,每次在SP中都會出錯。最終的結果是將其填入一個變量,然後用於發送給用戶的電子郵件。除了通過完整的SP之外,我無法重現該錯誤。即使我複製所有代碼並將其放入腳本中,它也可以正常運行。正如我剛纔提到的那樣,我最後一次修復它是通過DROP/CREATE。沒有代碼改變。 – Steve

+1

也許如果你找不到原因(這可能會影響生產環境),你可以使用'SUBSTRING'重寫?或者是'REVERSE'和'LEFT'的組合? –

回答

1

也許如果你找不到原因(這可能是生產環境的問題),你可以使用SUBSTRING來重寫?或者組合REVERSE & LEFT

+0

通過這樣做,我能夠發現我的問題是在別的地方,因爲我的代碼給出了相同的錯誤,當它不應該有。謝謝 – Steve

+0

@Steve不客氣Steve =) –

相關問題