如何将波斯语数转换为int

时间:2018-03-27 11:15:16

标签: sql sql-server data-conversion

有一个名为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,但我无法获得任何结果。

感谢。

2 个答案:

答案 0 :(得分:7)

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);

答案 1 :(得分:1)

看一下这个主题,它与你提出的问题相反,但如果你能扭转这一点,它可能对你有所帮助:

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

如果您使用的是最新版本的sql server,请尝试以下链接:

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

显而易见的是,SQL没有开箱即用的解决方案,您必须自己实现某种功能并使用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