大約兩週前,一直在過去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()
有一個硬編碼的長度。它怎麼會失效?
順便說一句,這段代碼的重點在於它需要一列中的「標籤」,如果以字母或數字結尾,則添加「:」,然後添加標籤的數據值。其他方面只是在它們之間放置一個空間。
你有沒有機會得到錯誤引發的確切數據('fl.xLabelText')? –
@TT。上面的SQL爲整個表運行它,它不會出錯。 SP中的SQL包含一個'WHERE'子句,它可以爲單個ID執行此操作。無論哪一個我都可以這樣做,每次在SP中都會出錯。最終的結果是將其填入一個變量,然後用於發送給用戶的電子郵件。除了通過完整的SP之外,我無法重現該錯誤。即使我複製所有代碼並將其放入腳本中,它也可以正常運行。正如我剛纔提到的那樣,我最後一次修復它是通過DROP/CREATE。沒有代碼改變。 – Steve
也許如果你找不到原因(這可能會影響生產環境),你可以使用'SUBSTRING'重寫?或者是'REVERSE'和'LEFT'的組合? –