---------------------------------资产负债表-----------------------------------CREATE PROCEDURE T0010
--AS 
DECLARE
@P_IND_ID varchar(6),      --科目代号
@P_ORG_ID char(8),         --公司代码
@P_RPT_YR char(4),         --报告年度
@P_RPT_PRD char(4),        --报告时段
@P_A0010 numeric(18,4),    --货币资金
@P_A0020 numeric(18,4),    --短期投资
@P_A0030 numeric(18,4),    --应收票据
@P_A0040 numeric(18,4),    --应收帐款
@P_A0050 numeric(18,4),    --其他应收帐款
@P_A0060 numeric(18,4),    --存货
@P_A0070 numeric(18,4),    --其他流动资产
@P_A0080 numeric(18,4),    --流动资产合计
@P_A0090 numeric(18,4),    --固定资产原值
@P_A0100 numeric(18,4),    --累计折旧
@P_A0110 numeric(18,4),    --固定资产净值
@P_A0120 numeric(18,4),    --在建工程
@P_A0130 numeric(18,4),    --其他固定资产
@P_A0140 numeric(18,4),    --固定资产合计
@P_A0150 numeric(18,4),    --递延税款借项
@P_A0160 numeric(18,4),    --资产总计
@P_A0170 numeric(18,4),    --短期借款
@P_A0180 numeric(18,4),    --应付票据
@P_A0190 numeric(18,4),    --应付帐款
@P_A0200 numeric(18,4),    --其他应付款
@P_A0210 numeric(18,4),    --其他流动负债
@P_A0220 numeric(18,4),    --流动负债合计
@P_A0230 numeric(18,4),    --长期借款
@P_A0240 numeric(18,4),    --应付债券
@P_A0250 numeric(18,4),    --长期应付款
@P_A0260 numeric(18,4),    --其他长期负债
@P_A0270 numeric(18,4),    --长期负债合计
@P_A0280 numeric(18,4),    --负债合计
@P_A0290 numeric(18,4),    --少数股东权益合计
@P_A0300 numeric(18,4),    --股本
@P_A0310 numeric(18,4),    --资本公积金
@P_A0320 numeric(18,4),    --盈余公积
@P_A0330 numeric(18,4),    --未确认的投资损失
@P_A0340 numeric(18,4),    --外币报表折算差额
@P_A0350 numeric(18,4),    --未分配利润
@P_A0360 numeric(18,4),    --股东权益总计
@P_A0370 numeric(18,4)     --负债和股东权益总计---------------查询数据---------------
SELECT 
@P_ORG_ID=F0010
,@P_RPT_YR=SUBSTRING(F1050,1,4)
,@P_RPT_PRD=SUBSTRING(F1050,5,4)
,@P_A0010=F0060
,@P_A0020=F0070
,@P_A0030=F0100
,@P_A0040=F0130
,@P_A0050=F0200
,@P_A0060=F0230
,@P_A0070=F0280
,@P_A0080=F0290
,@P_A0090=F0370
,@P_A0100=F0380
,@P_A0110=F0390
,@P_A0120=F0410
,@P_A0130=F1740
,@P_A0140=F0440
,@P_A0150=F0530
,@P_A0160=F0540
,@P_A0170=F0570
,@P_A0180=F0580
,@P_A0190=F0590
,@P_A0200=F0670
,@P_A0210=F0700
,@P_A0220=F0710
,@P_A0230=F0730
,@P_A0240=F0740
,@P_A0250=F0750
,@P_A0260=F0770
,@P_A0270=F0780
,@P_A0280=F0810
,@P_A0290=F0820
,@P_A0300=F0840
,@P_A0310=F0850
,@P_A0320=F0860
,@P_A0330=F0940
,@P_A0340=F0890
,@P_A0350=F0880
,@P_A0360=F0900
,@P_A0370=F0910
FROM yczealot.test.dbo.STK_D_BS WHERE  [object_name]='母公司报表'---------------插入数据---------------INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0010',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0010)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0020',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0020)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0030',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0030)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0040',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0040)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0050',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0050)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0060',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0060)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0070',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0070)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0080',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0080)INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
VALUES('A0090',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0090)GO
上面的语句中,查询的语句不止一条,怎么能循环插入查询结果?我想使用游标,但是提示在 游标声明 中不允许使用 变量赋值,有什么别的办法啊?

解决方案 »

  1.   

    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(...)
    SELECT ... FROM yczealot.test.dbo.STK_D_BS WHERE  [object_name]='母公司报表'
      

  2.   

    yczealot.test.dbo.STK_D_BS ,yczealot.test.dbo.IND_S_BSC_FIN 这两个表的表结构贴出来。因该地一个表 整理后,可以直接一次插入到第二个表
      

  3.   

    原来的一条记录会变成几十条记录插入到新表中,用
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(...)
    SELECT ... FROM yczealot.test.dbo.STK_D_BS WHERE  [object_name]='母公司报表'
    是可以,但是必须加union all,这样实际上是执行了多次查询,效率不行,现在需要的是一次查询,多次插入,查询的结果有很多条,因为在查询中使用了变量,又不好使用游标,怎么办?
      

  4.   

    请楼主试试:
    ----变量定义略
    ----定义游标
    declare cursor1 CURSOR STATIC FOR
    SELECT 
    @P_ORG_ID=F0010
    ,@P_RPT_YR=SUBSTRING(F1050,1,4)
    ,@P_RPT_PRD=SUBSTRING(F1050,5,4)
    ,@P_A0010=F0060
    ,@P_A0020=F0070
    ,@P_A0030=F0100
    ,@P_A0040=F0130
    ,@P_A0050=F0200
    ,@P_A0060=F0230
    ,@P_A0070=F0280
    ,@P_A0080=F0290
    ,@P_A0090=F0370
    ,@P_A0100=F0380
    ,@P_A0110=F0390
    ,@P_A0120=F0410
    ,@P_A0130=F1740
    ,@P_A0140=F0440
    ,@P_A0150=F0530
    ,@P_A0160=F0540
    ,@P_A0170=F0570
    ,@P_A0180=F0580
    ,@P_A0190=F0590
    ,@P_A0200=F0670
    ,@P_A0210=F0700
    ,@P_A0220=F0710
    ,@P_A0230=F0730
    ,@P_A0240=F0740
    ,@P_A0250=F0750
    ,@P_A0260=F0770
    ,@P_A0270=F0780
    ,@P_A0280=F0810
    ,@P_A0290=F0820
    ,@P_A0300=F0840
    ,@P_A0310=F0850
    ,@P_A0320=F0860
    ,@P_A0330=F0940
    ,@P_A0340=F0890
    ,@P_A0350=F0880
    ,@P_A0360=F0900
    ,@P_A0370=F0910
    FROM yczealot.test.dbo.STK_D_BS WHERE  [object_name]='母公司报表'
    open cursor1
    fetch next from cursor1 into @P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0010=F0060,@P_A0020=F0070,@P_A0030=F0100,@P_A0040=F0130,@P_A0050=F0200,@P_A0060=F0230,@P_A0070=F0280,@P_A0080=F0290,@P_A0090=F0370,@P_A0100=F0380,@P_A0110=F0390,@P_A0120=F0410,@P_A0130=F1740,@P_A0140=F0440,@P_A0150=F0530,@P_A0160=F0540,@P_A0170=F0570,@P_A0180=F0580,@P_A0190=F0590,@P_A0200=F0670,@P_A0210=F0700,@P_A0220=F0710,@P_A0230=F0730,@P_A0240=F0740,@P_A0250=F0750,@P_A0260=F0770,@P_A0270=F0780,@P_A0280=F0810,@P_A0290=F0820,@P_A0300=F0840,@P_A0310=F0850,@P_A0320=F0860,@P_A0330=F0940,@P_A0340=F0890,@P_A0350=F0880,@P_A0360=F0900,@P_A0370=F0910
    while @@fetch_status = 0
    begin 
    set @P_RPT_YR=SUBSTRING(@P_RPT_YR,1,4)
    set @P_RPT_PRD=SUBSTRING(@P_RPT_PRD,5,4)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0010',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0010)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0020',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0020)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0030',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0030)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0040',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0040)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0050',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0050)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0060',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0060)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0070',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0070)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0080',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0080)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0090',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0090)
    fetch next from cursor1 into @P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0010=F0060,@P_A0020=F0070,@P_A0030=F0100,@P_A0040=F0130,@P_A0050=F0200,@P_A0060=F0230,@P_A0070=F0280,@P_A0080=F0290,@P_A0090=F0370,@P_A0100=F0380,@P_A0110=F0390,@P_A0120=F0410,@P_A0130=F1740,@P_A0140=F0440,@P_A0150=F0530,@P_A0160=F0540,@P_A0170=F0570,@P_A0180=F0580,@P_A0190=F0590,@P_A0200=F0670,@P_A0210=F0700,@P_A0220=F0710,@P_A0230=F0730,@P_A0240=F0740,@P_A0250=F0750,@P_A0260=F0770,@P_A0270=F0780,@P_A0280=F0810,@P_A0290=F0820,@P_A0300=F0840,@P_A0310=F0850,@P_A0320=F0860,@P_A0330=F0940,@P_A0340=F0890,@P_A0350=F0880,@P_A0360=F0900,@P_A0370=F0910
    end
    close cursor1
    deallocate cursor1
      

  5.   

    抱歉,上面的有问题.又是复制惹的祸,游标定义的语法有问题,忘了删除变量.请楼主试一下这个:
    ----变量定义略
    ----定义游标
    declare cursor1 CURSOR STATIC FOR
    SELECT 
    F0010
    ,SUBSTRING(F1050,1,4)
    ,SUBSTRING(F1050,5,4)
    ,F0060
    ,F0070
    ,F0100
    ,F0130
    ,F0200
    ,F0230
    ,F0280
    ,F0290
    ,F0370
    ,F0380
    ,F0390
    ,F0410
    ,F1740
    ,F0440
    ,F0530
    ,F0540
    ,F0570
    ,F0580
    ,F0590
    ,F0670
    ,F0700
    ,F0710
    ,F0730
    ,F0740
    ,F0750
    ,F0770
    ,F0780
    ,F0810
    ,F0820
    ,F0840
    ,F0850
    ,F0860
    ,F0940
    ,F0890
    ,F0880
    ,F0900
    ,F0910
    FROM yczealot.test.dbo.STK_D_BS WHERE  [object_name]='母公司报表'
    open cursor1
    fetch next from cursor1 into @P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0010=F0060,@P_A0020=F0070,@P_A0030=F0100,@P_A0040=F0130,@P_A0050=F0200,@P_A0060=F0230,@P_A0070=F0280,@P_A0080=F0290,@P_A0090=F0370,@P_A0100=F0380,@P_A0110=F0390,@P_A0120=F0410,@P_A0130=F1740,@P_A0140=F0440,@P_A0150=F0530,@P_A0160=F0540,@P_A0170=F0570,@P_A0180=F0580,@P_A0190=F0590,@P_A0200=F0670,@P_A0210=F0700,@P_A0220=F0710,@P_A0230=F0730,@P_A0240=F0740,@P_A0250=F0750,@P_A0260=F0770,@P_A0270=F0780,@P_A0280=F0810,@P_A0290=F0820,@P_A0300=F0840,@P_A0310=F0850,@P_A0320=F0860,@P_A0330=F0940,@P_A0340=F0890,@P_A0350=F0880,@P_A0360=F0900,@P_A0370=F0910
    while @@fetch_status = 0
    begin 
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0010',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0010)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0020',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0020)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0030',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0030)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0040',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0040)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0050',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0050)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0060',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0060)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0070',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0070)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0080',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0080)
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
    VALUES('A0090',@P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0090)
    fetch next from cursor1 into @P_ORG_ID,@P_RPT_YR,@P_RPT_PRD,@P_A0010=F0060,@P_A0020=F0070,@P_A0030=F0100,@P_A0040=F0130,@P_A0050=F0200,@P_A0060=F0230,@P_A0070=F0280,@P_A0080=F0290,@P_A0090=F0370,@P_A0100=F0380,@P_A0110=F0390,@P_A0120=F0410,@P_A0130=F1740,@P_A0140=F0440,@P_A0150=F0530,@P_A0160=F0540,@P_A0170=F0570,@P_A0180=F0580,@P_A0190=F0590,@P_A0200=F0670,@P_A0210=F0700,@P_A0220=F0710,@P_A0230=F0730,@P_A0240=F0740,@P_A0250=F0750,@P_A0260=F0770,@P_A0270=F0780,@P_A0280=F0810,@P_A0290=F0820,@P_A0300=F0840,@P_A0310=F0850,@P_A0320=F0860,@P_A0330=F0940,@P_A0340=F0890,@P_A0350=F0880,@P_A0360=F0900,@P_A0370=F0910
    end
    close cursor1
    deallocate cursor1
      

  6.   

    declare cursor1 CURSOR STATIC FOR
    SELECT 
    @P_ORG_ID=F0010这一句仍然不行啊,提示同样的错误,游标中是不能使用变量赋值的?
      

  7.   

    --太長了@_@
    --定義游標
    declare c1 cursor scroll for
      select F0060,F0070...
      from yczealot.test.dbo.STK_D_BS WHERE [object_name]='母公司报表'
    open c1
    fetch first from c1 into @P_A0010,@P_A0020...
    while @@fetch_status=0
    begin
      insert XXXX
      fetch next from c1 into @P_A0010,@P_A0020...
    end
    close c1
    deallocate c1
      

  8.   

    只要保证fetch next from cursor1 into @.....中变量的顺序和DECLARE cursor1 ...FOR SELECT ....中列的顺序相同就行.
      

  9.   

    實際上樓主可以考慮用
    INSERT INTO yczealot.test.dbo.IND_S_BSC_FIN(IND_ID,ORG_ID,RPT_YR,RPT_PRD,F0010)
     select 'A0010',F0010,SUBSTRING(F1050,1,4),SUBSTRING(F1050,5,4),F0060  
      FROM yczealot.test.dbo.STK_D_BS WHERE  [object_name]='母公司报表'
    union all
     select 'A0020',F0010,SUBSTRING(F1050,1,4),SUBSTRING(F1050,5,4),F0070  
      FROM yczealot.test.dbo.STK_D_BS WHERE  [object_name]='母公司报表'
    union all
     select ...
     ...
      

  10.   

    用以下方法试试看
    declare @sql varchar(2000)
    @sql='declare cursor1 CURSOR STATIC FOR SELECT @P_ORG_ID=' + F0010 +''...
    exec(@sql)
      

  11.   

    用以下方法试试看
    declare @sql varchar(2000)
    set @sql='declare cursor1 CURSOR STATIC FOR SELECT @P_ORG_ID=' + F0010 +''...
    exec(@sql)
      

  12.   

    union all不行,要多次查询,效率不高
      

  13.   

    何况这种转换是最简单的一种,以后还有经过复杂计算的,所以不考虑用union all
      

  14.   

    用以下方法试试看
    declare @sql varchar(2000)
    set @sql='declare cursor1 CURSOR STATIC FOR SELECT @P_ORG_ID=' + F0010 +''...
    exec(@sql)这种方法还不是在游标中使用了变量赋值啊?
      

  15.   

    不理解樓主,既然聲明游標,為什麼要select @a=a 這個樣子??
    直接declare c1 cursor scroll for
        select a from T
        open c1
        fetch first from c1 into @a 不是可以麼?