2016-12-06 62 views
0

sm_Value是一个TEXT列,我需要将其转换为INT在SQL中将文本转换为INT

作为一个事实,即只有两个人会乱用这个表中,列将是数值(幽默我)

我收到此错误信息:

消息206,级别16,状态2,过程User_Password_Date_Interval_Check,10号线
操作数类型冲突:文本与诠释

不相容我曾尝试:

SELECT CONVERT(INT, sm_Value)) 
FROM Setting_Misc 

但我仍然得到错误。

IF EXISTS (SELECT * FROM sysobjects 
      WHERE type = 'P' AND name = 'User_Password_Date_Interval_Check') 
BEGIN 
    PRINT 'Dropping Procedure User_Password_Date_Interval_Check' 
    DROP Procedure User_Password_Date_Interval_Check 
END 
GO 

PRINT 'Creating Procedure User_Password_Date_Interval_Check' 
GO 

CREATE Procedure User_Password_Date_Interval_Check 
    @ua_pk uniqueidentifier 
AS 
    DECLARE @PasswordExpireDays INT 

    SELECT 
     CONVERT(INT, CONVERT(VARCHAR(MAX), sm_Value)) 
    FROM Setting_Misc 

    SELECT 
     @PasswordExpireDays = COALESCE(sm_Value,0) 
    FROM 
     Setting_Misc AS sm 
    INNER JOIN 
     Syndicates As syn ON sm.syn_fk = syn.syn_pk 
    INNER JOIN 
     Company As c ON c.syn_fk = syn.syn_pk 
    INNER JOIN 
     User_Accounts As ua ON ua.c_fk = c.c_pk 
    WHERE 
     sm.sm_Setting = 'PasswordExpireDays' 
GO 

GRANT EXEC ON User_Password_Date_Interval_Check TO WEB 
+1

你为什么先把它转换成varchar(max)? – scsimon

+0

[将数字转换成文本数据类型转换为int](http://stackoverflow.com/questions/15346002/convert-number-stored-as-text-data-type-to-int) – dfundako

+0

'@PasswordExpireDays '似乎是你的错误是如此只是将它转换为'@PasswordExpireDays = COALESCE(CONVERT(INT,CONVERT(varchar(max),sm_Value)),0)' – scsimon

回答

1

您必须在设置变量的位置进行转换。

IF EXISTS (SELECT * FROM sysobjects 
      WHERE type = 'P' AND name = 'User_Password_Date_Interval_Check') 
BEGIN 
    PRINT 'Dropping Procedure User_Password_Date_Interval_Check' 
    DROP Procedure User_Password_Date_Interval_Check 
END 
GO 

PRINT 'Creating Procedure User_Password_Date_Interval_Check' 
GO 

CREATE Procedure User_Password_Date_Interval_Check 
    @ua_pk uniqueidentifier 
AS 
    DECLARE @PasswordExpireDays INT 
    --This conversion doesn't cascade down to the next SELECT statement 
    SELECT 
     CONVERT(INT, CONVERT(VARCHAR(MAX), sm_Value)) 
    FROM Setting_Misc 

    SELECT 
     --Here is what has to change 
     [email protected] = COALESCE(sm_Value,0) 
      @PasswordExpireDays = CONVERT(INT, CONVERT(VARCHAR(MAX), sm_Value)) 
    FROM 
     Setting_Misc AS sm 
    INNER JOIN 
     Syndicates As syn ON sm.syn_fk = syn.syn_pk 
    INNER JOIN 
     Company As c ON c.syn_fk = syn.syn_pk 
    INNER JOIN 
     User_Accounts As ua ON ua.c_fk = c.c_pk 
    WHERE 
     sm.sm_Setting = 'PasswordExpireDays' 
GO 

GRANT EXEC ON User_Password_Date_Interval_Check TO WEB 
+0

你。是。一个。天赐良机。谢谢! –

+1

哈我不会那么远@KevinFischer,但很乐意帮助 – scsimon

+0

,只是为了官方目的,它的工作原理。没有错误 –