教导处主任

导航

 
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name='proc_NumSum')
    DROP PROC proc_NumSum         
GO
CREATE PROC proc_NumSum
    @Values VARCHAR(2000),            
    @ValuesOut VARCHAR(2000) OUTPUT --输出参数
AS
    DECLARE @OnOff INT,                --开关
    @ListNum VARCHAR(50),            --临时存放切割后的参数
    @Value  VARCHAR(50),            --第二次临时存放再次切割后的参数
    @Type         VARCHAR(8),        --保存数据数据类型    
    @Num         FLOAT,                --临时保存要计算的数字
    @Denominator FLOAT        =0,        --要计算的分母
    @Molecule     FLOAT        =0        --要计算的分子
BEGIN
    IF(OBJECT_ID('#ListValue') IS NOT NULL)                        
        BEGIN 
            DROP TABLE #ListValue
        END
    CREATE TABLE #ListValue(ltype VARCHAR(8),lvalue VARCHAR(100))    
    SELECT * INTO #TEMP FROM Split(@Values,';')    
    DECLARE authors_cursor CURSOR FOR SELECT * FROM #TEMP
    OPEN authors_cursor
    SELECT @OnOff=SetValue FROM [object] where Name='含量比例开关';
    FETCH NEXT FROM authors_cursor INTO @ListNum WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO #ListValue VALUES(SUBSTRING(@ListNum,0,CHARINDEX(':',@ListNum))
        ,SUBSTRING(@ListNum,CHARINDEX(':',@ListNum)+1,LEN(@ListNum)))
        FETCH NEXT FROM authors_cursor INTO @ListNum
    END
    CLOSE authors_cursor
    DEALLOCATE authors_cursor
    IF @OnOff=1
        BEGIN
            SELECT  @Denominator=SUM(CAST(lvalue AS FLOAT)) 
            FROM #ListValue WHERE ltype='1'; --'1'为分母值的类型
        END
    DECLARE @i INT =1
    DECLARE List_cursor CURSOR FOR SELECT * FROM #ListValue
    OPEN List_cursor
    FETCH NEXT FROM List_cursor INTO @Type,@Num WHILE @@FETCH_STATUS = 0
    IF @OnOff =0
        BEGIN
             IF @i=1
                 BEGIN
                     SET @Denominator=CAST(@Num AS FLOAT)
                     SET @ValuesOut=CAST(@Denominator/@Denominator*100 AS VARCHAR)+';'
                 END
             ELSE
                 BEGIN
                     SET @ValuesOut+=CAST(CAST(@Num AS FLOAT)/@Denominator*100 AS VARCHAR)+';'
                 END
             SET @i=@i+1
            FETCH NEXT FROM List_cursor INTO @Type,@Num
        END
    ELSE IF @OnOff=1
        BEGIN
            SET @ValuesOut+=CAST(CAST(@Num AS FLOAT)/@Denominator*100 AS VARCHAR)+';'
            FETCH NEXT FROM List_cursor INTO @Type,@Num
        END
    CLOSE List_cursor
    DEALLOCATE List_cursor
    PRINT (@ValuesOut)
END;
GO


EXEC proc_NumSum '1:1.00;2:2.00;2:3.00;2:4.00;1:5.00;1:6.00;3:7.00;3:8.00;',1

 

posted on 2012-11-16 14:46  教导处主任  阅读(202)  评论(0)    收藏  举报