将 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Nvarchar 列转换为 INT

将数据类型 nvarchar 转换为数值异常时出错

将数据类型 int 转换为 nvarchar 时出错

将 nvarchar 值...转换为数据类型 int 时转换失败

将数据类型 nvarchar 转换为数值时出错

将Nvarchar(max)转换为nvarchar(30)的最佳/最有效的方法