有一个名为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
。
到目前为止,我使用CAST
,CONVERT
和collate Persian_100_CI_AI
,但我无法获得任何结果。
感谢。
答案 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)
看一下这个主题,它与你提出的问题相反,但如果你能扭转这一点,它可能对你有所帮助:
如果您使用的是最新版本的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