我有這個計算列
ALTER TABLE mytable
ADD vMessage AS (CONVERT([nvarchar] (200),RIGHT(Message,CHARINDEX('.',REVERSE(Message),1)-1),0))
我正在嘗試建立一個索引vMessage
CREATE NONCLUSTERED INDEX [IX_vMessage]
ON mytable ([vMessageType])
我收到這個錯誤
Invalid length parameter passed to the RIGHT function.
創建計算列并運行此查詢有效
SELECT
Message,
RIGHT(Message,charindex('.',reverse(Message),1)-1),
CONVERT([nvarchar](200),RIGHT(Message,CHARINDEX('.',REVERSE(Message),1)-1),0)
FROM mytable
資料類似于此示例資料。
DECLARE @mytable TABLE (message nvarchar(1024))
INSERT INTO @mytable (message) VALUES
('Services.Common.Contracts.InternalContract'),
('Services.Common.Contracts.ItemArchivedContract'),
('Services.Common.Contracts.ItemCreatedContract'),
('Services.Common.Contracts.ItemInformationUpdatedContract'),
('Services.Common.Contracts.EmailContract'),
('Services.Common.Contracts.Customer.SetCredentialsContract'),
('Services.Common.Contracts.InternalItemContract')
SELECT
Message,
RIGHT(Message,charindex('.',reverse(Message),1)-1),
CONVERT([nvarchar](200),RIGHT(Message,CHARINDEX('.',REVERSE(Message),1)-1),0)
FROM @myTable
沒有訊息是空的。所有訊息中至少有一個點字符。下面什么都不回傳。
SELECT * FROM mytable WHERE CHARINDEX('.', Message) = 0
uj5u.com熱心網友回復:
問題是如果它沒有找到正在搜索的值,它CHARINDEX可以回傳。為0避免因此而導致錯誤,您應該始終將CHARINDEXNULLIF0
ALTER TABLE mytable
ADD vMessage AS (
CONVERT(nvarchar(200),
RIGHT(
Message,
NULLIF(
CHARINDEX(
'.',
REVERSE(Message)
),
0
) - 1
)
)
);
我說always,因為使用 aWHERE并不總是有幫助,因為 SQL Server 經常重新排列運算式。NULLIF在內部使用 a CASE,這是唯一保證不會發生這種情況的方法。
uj5u.com熱心網友回復:
代碼首先反轉字串,然后CHARINDEX()用于查找.字符。由于您不想保留.最終結果,因此您從回傳值中減去 1。這就是問題所在。
CHARINDEX()如果未找到該值,則回傳 0(對字串使用基于 1 而不是基于 0 的索引)。當我們從中減去 1 并將其傳遞給RIGHT()函式時,您的引數無效并且會看到此錯誤。
但我也看到了這個:
所有訊息中至少有一個點字符。
我建議再次檢查。也許測驗在與生產不同的環境中運行。當我們將其加載到 db fiddle 時,我們可以看到您的查詢在提供的示例資料上運行良好:
https://dbfiddle.uk/bUMPVALz
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/507035.html
標籤:sql服务器
上一篇:為什么TRYCATCH成功更新SSMS上的行,但從Tomcat應用程式運行時卻沒有?
下一篇:將JSON陣列列展平為不同的結果
