Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 存储过程-TRY_CAST()_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 存储过程-TRY_CAST()

Sql 存储过程-TRY_CAST(),sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我提出了一个使用TRY的查询_CAST@VAR如小数点18,2所示 它正在工作,但当我尝试“0.00”时,它返回null DECLARE @FROMHEADERPH TABLE (id int identity, headername nvarchar(max)) INSERT INTO @FROMHEADERPH SELECT LTRIM(RTRIM(column_name)) FROM tbl_hrms_header where item_group = 'PerHour' DECLARE

我提出了一个使用TRY的查询_CAST@VAR如小数点18,2所示 它正在工作,但当我尝试“0.00”时,它返回null

DECLARE @FROMHEADERPH TABLE (id int identity, headername nvarchar(max))
INSERT INTO @FROMHEADERPH
SELECT LTRIM(RTRIM(column_name)) FROM tbl_hrms_header where item_group = 'PerHour'

DECLARE @PERHOUR int
SELECT @PERHOUR = COUNT(*) from @FROMHEADERPH
DECLARE @ALLDATEFORMATSBM TABLE (
[Id]        int identity,
[SBM]   nvarchar(max)
)

DECLARE @MAX int = 1
WHILE @MAX <= @PERHOUR
BEGIN
    DECLARE @WEWE nvarchar(max)
    SELECT @WEWE = headername from @FROMHEADERPH where id = @MAX


    DECLARE @q nvarchar(max)
    SET @q = N'SELECT '+ @WEWE +' FROM TemporaryProfile'
    INSERT INTO  @ALLDATEFORMATSBM(SBM)
    EXEC (@q)

    DECLARE @IFCONVERTED table(id int identity, [FIELDS] nvarchar(max));

    DECLARE @TSBM table(id int identity, [TSBM] nvarchar(max)); 
    DECLARE @VSBM nvarchar(max);

    DECLARE @MAXSBM int
    SELECT @MAXSBM = MAX(id) FROM @ALLDATEFORMATSBM
    DECLARE @COUNTSBM int;
    SELECT @COUNTSBM = MIN(id) FROM @ALLDATEFORMATSBM
    WHILE @MAXSBM >= @COUNTSBM
    BEGIN
        DECLARE @SBM nvarchar(max);
        SELECT @SBM = SBM FROM @ALLDATEFORMATSBM WHERE Id = @MAXSBM


        INSERT INTO @TSBM
        SELECT   
        CASE WHEN TRY_CAST(@SBM AS decimal(18,2)) IS NULL   
        THEN 'Cast failed'  
        ELSE 'Cast succeeded'  
        END AS Result;

        DECLARE @WEW int
        SELECT @WEW = MIN(id) FROM @TSBM;


            SELECT @VSBM = TSBM FROM @TSBM Where id = @WEW
        PRINT CAST(@MAXSBM as nvarchar(max)) + ' - ' + CAST(@COUNTSBM as nvarchar(max)) + ' # ' + @SBM + ' !@ ' + CAST(@WEW as nvarchar(max)) + ' :: ' + @VSBM
            if @VSBM = 'Cast failed'
            BEGIN
             insert into @IFCONVERTED([FIELDS]) values(@WEWE);
             BREAK;
            END
            ELSE
            BEGIN
             Print '---'
            END


        DELETE FROM @TSBM
        SET @MAXSBM = @MAXSBM - 1
    END
    DELETE FROM @ALLDATEFORMATSBM
    SET @MAX = @MAX + 1
END
SELECT * FROM @IFCONVERTED
我用字符串填充dailypay来检查我的试播。它在第一列工作,但当它出现在另外两列具有数值的列时,转换失败


有人能帮我吗?我真的已经筋疲力尽了

我重建了我的查询。这是我的最后一个问题

DECLARE @FROMHEADERPH TABLE (id int identity, headername nvarchar(max))
INSERT INTO @FROMHEADERPH
SELECT LTRIM(RTRIM(column_name)) FROM tbl_hrms_header where item_group = 'PerHour'

DECLARE @IFCONVERTED table(id int identity, [FIELDS] nvarchar(max)); --  collect all invalid fields

DECLARE @PERHOUR int
SELECT @PERHOUR = COUNT(*) from @FROMHEADERPH
DECLARE @ALLDATEFORMATSBM TABLE (
    [Id]        int identity,
    [DataStringss]   nvarchar(max)
    )
DECLARE @MAX int = 1
WHILE @MAX <= @PERHOUR
BEGIN
    DECLARE @WEWE nvarchar(max)
    SELECT @WEWE = headername from @FROMHEADERPH where id = @MAX


    --PRINT @WEWE + '-' + cast(@MAX AS NVARCHAR(MAX))
    DECLARE @q nvarchar(max)
    SET @q = N'SELECT '+ @WEWE +' FROM TemporaryProfile'
    INSERT INTO  @ALLDATEFORMATSBM([DataStringss])
    EXEC (@q)
    SELECT * FROM @ALLDATEFORMATSBM

    DECLARE @COUNTH int, @MAXH int = (SELECT MIN(Id) FROM @ALLDATEFORMATSBM)
    SELECT @COUNTH = MAX(Id) FROM @ALLDATEFORMATSBM
    PRINT CAST(@MAXH as nvarchar(max)) + '-' + CAST(@COUNTH as nvarchar(max))

    WHILE @MAXH <= @COUNTH
    BEGIN
        DECLARE @DS nvarchar(max)
        SELECT @DS = [DataStringss] FROM @ALLDATEFORMATSBM WHERE Id = @MAXH
        PRINT @DS

        DECLARE @CASTING nvarchar(max)
        SELECT @CASTING = TRY_CAST(@DS AS NUMERIC(18,2))

        IF @CASTING is null
        BEGIN
            INSERT INTO @IFCONVERTED
            VALUES(@WEWE)
            BREAK
        END
        ELSE
        BEGIN
            PRINT '----'
        END

        SET @MAXH = @MAXH + 1
    END


    DELETE FROM @ALLDATEFORMATSBM
    SET @MAX = @MAX + 1
END
    SELECT DISTINCT * FROM @IFCONVERTED

我建议你把你的例子简单得多。显然,“0.00”可以转换为十进制。您的问题是另一个问题-它可能会从值中的空格变化到相当复杂的RBAR逻辑中的错误。可能还会输出一组值的转换值和未转换值,或者@MAX时,您确定该值是数字0而不是字母O吗?我使用字母顺序的O得到NULL,声明@VAR nvarcharmax='O.OO'选择TRY_CAST@VAR小数点18,2;但是,使用数字0,效果很好。声明@VAR nvarcharmax='0.00'选择TRY_CAST@VAR小数点18,2;在尝试施法之前,在@SBM处插入一个打印,以查看此时的值。插入打印asciisubstring@SBM,1,1打印asciisubstring@SBM,2,1打印asciisubstring@SBM,3,1打印asciisubstring@SBM,4,1以查看ascii码是否为48、46、48、48
DECLARE @FROMHEADERPH TABLE (id int identity, headername nvarchar(max))
INSERT INTO @FROMHEADERPH
SELECT LTRIM(RTRIM(column_name)) FROM tbl_hrms_header where item_group = 'PerHour'

DECLARE @IFCONVERTED table(id int identity, [FIELDS] nvarchar(max)); --  collect all invalid fields

DECLARE @PERHOUR int
SELECT @PERHOUR = COUNT(*) from @FROMHEADERPH
DECLARE @ALLDATEFORMATSBM TABLE (
    [Id]        int identity,
    [DataStringss]   nvarchar(max)
    )
DECLARE @MAX int = 1
WHILE @MAX <= @PERHOUR
BEGIN
    DECLARE @WEWE nvarchar(max)
    SELECT @WEWE = headername from @FROMHEADERPH where id = @MAX


    --PRINT @WEWE + '-' + cast(@MAX AS NVARCHAR(MAX))
    DECLARE @q nvarchar(max)
    SET @q = N'SELECT '+ @WEWE +' FROM TemporaryProfile'
    INSERT INTO  @ALLDATEFORMATSBM([DataStringss])
    EXEC (@q)
    SELECT * FROM @ALLDATEFORMATSBM

    DECLARE @COUNTH int, @MAXH int = (SELECT MIN(Id) FROM @ALLDATEFORMATSBM)
    SELECT @COUNTH = MAX(Id) FROM @ALLDATEFORMATSBM
    PRINT CAST(@MAXH as nvarchar(max)) + '-' + CAST(@COUNTH as nvarchar(max))

    WHILE @MAXH <= @COUNTH
    BEGIN
        DECLARE @DS nvarchar(max)
        SELECT @DS = [DataStringss] FROM @ALLDATEFORMATSBM WHERE Id = @MAXH
        PRINT @DS

        DECLARE @CASTING nvarchar(max)
        SELECT @CASTING = TRY_CAST(@DS AS NUMERIC(18,2))

        IF @CASTING is null
        BEGIN
            INSERT INTO @IFCONVERTED
            VALUES(@WEWE)
            BREAK
        END
        ELSE
        BEGIN
            PRINT '----'
        END

        SET @MAXH = @MAXH + 1
    END


    DELETE FROM @ALLDATEFORMATSBM
    SET @MAX = @MAX + 1
END
    SELECT DISTINCT * FROM @IFCONVERTED