Sql 如何将波斯语数字转换成整数
有一个名为value的nvarhar100列,当用户插入该列时,我需要在触发器中检查以下代码:Sql 如何将波斯语数字转换成整数,sql,sql-server,data-conversion,Sql,Sql Server,Data Conversion,有一个名为value的nvarhar100列,当用户插入该列时,我需要在触发器中检查以下代码: 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) ret
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
但在应用程序接口中,数字是用波斯语插入的,所以总是isnumericvalue=0
例如,如果用户在界面中插入۴۵,我需要在我的触发值中显示为45
到目前为止,我使用铸造,转换和整理波斯100_CI_AI,但我没有得到任何结果
谢谢。哪个版本的SQL Server?v2017+提供了一个全新的解决方案
也许有一种更优雅的方式,但务实的方式是:
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);
哪个版本的SQL Server?v2017+提供了一个全新的解决方案
也许有一种更优雅的方式,但务实的方式是:
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);
看看这个话题,它与你所问的正好相反,但如果你能逆转它,它可能会对你有所帮助: 如果您使用的是最新版本的sql server,请尝试以下链接: 很明显,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
看看这个话题,它与你所问的正好相反,但如果你能逆转它,它可能会对你有所帮助: 如果您使用的是最新版本的sql server,请尝试以下链接: 很明显,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
波斯语数字只是SQL Server的文本。在客户端转换数字或查找SQL Server扩展,如UDF或CLR UDF。看这个。波斯语数字只是SQL Server的文本。在客户端转换数字或查找SQL Server扩展,如UDF或CLR UDF。看到了吗,就是角色不同?美好的one@Andomar,说实话:我希望如此:-一个简短的研究让它看起来像这样…谢谢老兄!它确实可以正常工作,但我使用10个单独的替换来代替此解决方案,并使用客户端统计信息检查这两个替换,它确实可以单独获得更好的时间结果!非常感谢,只是角色不同?美好的one@Andomar,说实话:我希望如此:-一个简短的研究让它看起来像这样…谢谢老兄!它确实可以正常工作,但我使用10个单独的替换来代替此解决方案,并使用客户端统计信息检查这两个替换,它确实可以单独获得更好的时间结果!非常感谢还有一个话题可能会对你有所帮助谢谢你我不知道,我绝对会查出来的!谢谢很高兴能帮上忙这是另一个可能会帮助你的话题,谢谢你,伙计,我不知道,我绝对会看看这个!谢谢很高兴能帮上忙