将NVARCHAR转换为INT

时间:2013-06-25 07:49:37

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

列数据类型为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转换为数据类型numeric的算术溢出错误。

UsrMast表中Usr_Priv值为

10101111111111111111111111111111111111111111111111

请帮帮我。

1 个答案:

答案 0 :(得分:0)

您只能在数值数据类型中存储最多此值:

您可以存储的最大长度值最多为38但您的数据为(10101111111111111111111111111111111111111111111111)50个字符数值。所以,没办法......

看看这个:

  • 十进制[(p [,s])]和数字[(p [,s])]: 固定精度和刻度数。使用最大精度时,有效值为 - 10 ^ 38 +1到10 ^ 38 - 1.

  • bigint: 整数(整数)数据从-2 ^ 63(-9,223,372,036,854,775,808)到2 ^ 63-1(9,223,372,036,854,775,807)。存储大小为8个字节。

  • int: 从-2 ^ 31(-2,147,483,648)到2 ^ 31 - 1(2,147,483,647)的整数(整数)数据。存储大小为4个字节。 int的SQL-92同义词是整数。

  • smallint: 整数数据从-2 ^ 15(-32,768)到2 ^ 15 - 1(32,767)。存储大小为2个字节。

  • tinyint: 0到255之间的整数数据。存储大小为1个字节。