将 NVARCHAR 转换为 INT
Posted
技术标签:
【中文标题】将 NVARCHAR 转换为 INT【英文标题】:Converting NVARCHAR TO INT 【发布时间】:2013-06-25 07:49:37 【问题描述】:列数据类型为NVARCHAR(MAX)
。如何将其转换为Integer
?
CREATE TABLE UsrMast(Usr_Id int,
Usr_Pswd varchar(30),
Usr_Priv varchar(100))
CREATE TABLE T117_MenuMst(MenuID int,
Text varchar(50),
Description varchar(200),
ParentID int,
NavigateUrl varchar(100))
存储过程
CREATE PROCEDURE USP_MENUITEM (@UserID [varchar](50))
BEGIN
CREATE TABLE #TMP(MenuID INT, Text VARCHAR(50), Description VARCHAR(50), ParentID INT, NavigateUrl VARCHAR(100))
DECLARE @VAL NVARCHAR(MAX), @Pos INT, @len INT
--SET @VAL=(SELECT REPLACE(REPLACE(CONVERT(VARCHAR(30), SUM(CAST(PrivilegeID AS NUMERIC(30, 0)))), '2', '1'), '3', '1') FROM tblGroupPrivMst WHERE GroupCode in (SELECT GroupCode FROM tblUserGrpMap WHERE UserID=@UserID))
SET @VAL=(SELECT REPLACE(REPLACE(CONVERT(VARCHAR(70), SUM(CAST(Usr_Priv AS NUMERIC(38, 0)))), '2', '1'), '3', '1') FROM T112_UsrMast WHERE Usr_Id=@UserID)
SET @Pos=1
SET @len=LEN(@VAL)
WHILE(@len!=0)
BEGIN
DECLARE @Value CHAR(1)
SET @Value=SUBSTRING(@VAL, @Pos, 1)
IF @Value=1
BEGIN
PRINT @Value
INSERT INTO #TMP SELECT * FROM T117_MenuMst WHERE MenuID=@Pos
END
SET @Pos=@Pos+1
SET @len=@len-1
END
--For first Node (Inserting The Parent Node)
INSERT INTO #TMP SELECT * FROM T117_MenuMst WHERE MenuID IN(SELECT DISTINCT ParentID FROM #TMP WHERE ParentID NOT IN(SELECT MenuID FROM #TMP))
--For second Node (Inserting The Parent Node)
INSERT INTO #TMP SELECT * FROM T117_MenuMst WHERE MenuID IN(SELECT DISTINCT ParentID FROM #TMP WHERE ParentID NOT IN(SELECT MenuID FROM #TMP))
--For third Node (Inserting The Parent Node)
INSERT INTO #TMP SELECT * FROM T117_MenuMst WHERE MenuID IN(SELECT DISTINCT ParentID FROM #TMP WHERE ParentID NOT IN(SELECT MenuID FROM #TMP))
SELECT * FROM #TMP ORDER BY MenuID ASC
DROP TABLE #TMP
END
但我得到:
将 nvarchar 转换为数字数据类型时出现算术溢出错误。
在UsrMast
表中Usr_Priv
的值为
10101111111111111111111111111111111111111111111111
请帮帮我。
【问题讨论】:
什么数据库系统和这个版本是什么?? 在大多数数据库系统中,INT
的最大值 值为 2'147'483'648(刚刚超过 20 亿)。对于INT
,您的字符串太大了!这就是正是错误在说什么......
我正在使用 SQLSERVER 2008R2,N 我的错误正是“将 nvarchar 转换为数字数据类型的算术溢出错误。”
Usr_priv 用于存储用户权限,实际上我的项目中有 60 多个菜单项。以前只有 32 项。上面的查询最多可以工作 38 即(长度(usr_priv)= 38.////usr_priv='10101111111111111111111111111111111111 为 38 个字符)。
作为INT
,这个数字太大了!您不能将其转换为 INT -
【参考方案1】:
您最多只能在数值数据类型中存储此值:
您可以存储的最大长度值最多为 38,但您的数据是 (1010111111111111111111111111111111111111111111111) 50 个字符的数值。所以,没办法……
看看这个:
十进制 [ (p[ ,s] )] 和数字 [ (p[ ,s] )] : 固定精度和比例数字。使用最大精度时,有效值从 - 10^38 +1 到 10^38 - 1。
大整数: 从 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 的整数(整数)数据。存储大小为 8 个字节。
整数: 从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整数(整数)数据。存储大小为 4 个字节。 int 的 SQL-92 同义词是整数。
小整数: 从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整数数据。存储大小为 2 个字节。
tinyint: 从 0 到 255 的整数数据。存储大小为 1 个字节。
【讨论】:
以上是关于将 NVARCHAR 转换为 INT的主要内容,如果未能解决你的问题,请参考以下文章