【问题标题】:Converting NVARCHAR TO INT将 NVARCHAR 转换为 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 -

标签: stored-procedures sql-server-2008-r2 type-conversion conventions menubar


【解决方案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 个字节。

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2012-08-16
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多