如何将波斯数字转换为 int

how to convert persian number to int

有一个名为 value 的 nvarchar(100) 列,当用户插入该列时,我需要在触发器中检查下面的代码:

if exists
(
    select *
    from inserted i
    where isnumeric(value)=0
)
begin
    rollback transaction
    raiserror('when productType is numeric, You have to insert numeric character',18,1)
    return
end

但是在应用程序界面中插入的数字是波斯语,所以总是isnumeric(value)=0

例如,如果用户在界面中插入 ۴۵,我需要将触发值显示为 45

到目前为止,我使用了 CASTCONVERTcollate Persian_100_CI_AI,但我无法得到任何结果。

谢谢。

哪个版本的SQL Server? v2017+ 提供了 new function TRANSLATE.

可能有一种更优雅但更实用的方法:

DECLARE @PersianNumber NVARCHAR(100)=N'۴۵';
SELECT CAST(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
           (@PersianNumber,N'۰',N'0'),N'۱',N'1'),N'۲',N'2'),N'۳',N'3'),N'۴',N'4')
                          ,N'۵',N'5'),N'۶',N'6'),N'۷',N'7'),N'۸',N'8'),N'۹',N'9') AS INT);

看看这个话题,它与你问的相反,但如果你能扭转它可能会对你有所帮助:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a44ce5c1-d487-4043-be73-b64fa98ed7a5/converting-english-numbers-to-arabic-numbers-and-vice-versa

如果您使用的是最新版本的 sql 服务器,请尝试此 link :

https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql

显而易见的是SQL没有解决方案out-of-the-box,你必须自己实现某种功能并使用WHERE语句中的返回值。

我已经使用 Shungo 的答案来实现你需要的功能(也适用于英文数字或两者的混合):

CREATE FUNCTION IS_NORMALIZED_NUMBER (@PersianNumber NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
BEGIN
    SET @PersianNumber = CAST(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
           (@PersianNumber,N'۰',N'0'),N'۱',N'1'),N'۲',N'2'),N'۳',N'3'),N'۴',N'4')
                          ,N'۵',N'5'),N'۶',N'6'),N'۷',N'7'),N'۸',N'8'),N'۹',N'9') AS NVARCHAR(MAX));
    RETURN ISNUMERIC(@PersianNumber)
END

这是一个更优化的版本(只适用于波斯数字):

CREATE FUNCTION IS_NUMBER (@PersianNumber NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
BEGIN
    RETURN IIF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
           (@PersianNumber,N'۰',N''),N'۱',N''),N'۲',N''),N'۳',N''),N'۴',N'')
                          ,N'۵',N''),N'۶',N''),N'۷',N''),N'۸',N''),N'۹',N'') = N'',1 ,0 );
END