Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将波斯语数字转换成整数_Sql_Sql Server_Data Conversion - Fatal编程技术网

Sql 如何将波斯语数字转换成整数

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

有一个名为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)
    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个单独的替换来代替此解决方案,并使用客户端统计信息检查这两个替换,它确实可以单独获得更好的时间结果!非常感谢还有一个话题可能会对你有所帮助谢谢你我不知道,我绝对会查出来的!谢谢很高兴能帮上忙这是另一个可能会帮助你的话题,谢谢你,伙计,我不知道,我绝对会看看这个!谢谢很高兴能帮上忙