--定义全局临时表
declare @temp table(id int identity,辅助项部门 nvarchar(100),客户 nvarchar (100),
    项目名称 nvarchar (100),辅助项的销售业务类别 nvarchar (100),科目名称 nvarchar (100),
    借方金额 float ,贷方金额 float)
--定义科目表
declare @tempTable table( 科目名称 nvarchar (100))
--定义科目表行数,行索引,定义列名,定义sql语句
declare @RowCount int, @RowIndex int ,@ColumnName nvarchar (50),@Sql nvarchar(1000)
--定义游标
declare myCursor Cursor for select * from @tempTable--填充全局数据表
insert into @temp select * from( select 
   (select cDepName from Department where cDepCode=cdept_id) as '辅助项部门',
   (select cCusName from Customer where cCusCode=ccus_id) as '客户',
   (select citemname from fitemss97 where fitemss97.citemcode=GL_accvouch.citem_id) as '项目名称',
   cDefine2 as '辅助项的销售业务类别',
   (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称',
   md as '借方金额',
   mc as '贷方金额'  from GL_accvouch  ) a--填充科目表
insert into @tempTable select * from 
    (select 
        (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称' 
    from GL_accvouch) aa 
group by 科目名称--取科目表行数
select @RowCount = count(*) from @tempTable--打开索引,循环向全局表中插入新列
open myCursorfetch next from myCursor into @ColumnNamewhile @@fetch_status = 0
begin
    set @Sql = 'alter table @temp add ' + @ColumnName + ' nvarchar(50) default null' 
    print @Sql
    exec(@sql)
    fetch next from myCursor into @ColumnName
endclose myCursor
deallocate myCursor--返回全局表
select * from @temp
执行时报错
(144 行受影响)(38 行受影响)
alter table exec(@temp) add 09年其他应付款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 09年以前其他应付款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 办公设备 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 北京公司未开发票应付业务款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 北京公司未开发票预收业务款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 北京公司已开发票应付非业务款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 北京公司已开发票应付业务款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 北京公司已开发票预收业务款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 北京公司应收账款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 本年利润 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。
alter table exec(@temp) add 短期借款 nvarchar(50) default null
消息 156,级别 15,状态 1,第 1 行
在关键字 'exec' 附近有语法错误。
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@temp'。

解决方案 »

  1.   

    set @Sql = 'alter table @temp add ' + @ColumnName + ' nvarchar(50) default null' 这里不能这么写吧,@temp不能放里面.'alter table'+@temp+'add'+...
      

  2.   

    如果把 @temp放在外面的话,就说 @temp变量没定义,到底是怎么回事啊
      

  3.   

    比较难 我还没写过这么复杂的sql  订
      

  4.   

    --定义科目表 
    declare @tempTable table( 科目名称 nvarchar (100)) 
    --定义科目表行数,行索引,定义列名,定义sql语句 
    declare @RowCount int, @RowIndex int ,@ColumnName nvarchar (50),@Sql nvarchar(1000) 
    --定义游标 
    declare myCursor Cursor for select * from @tempTable --填充全局数据表 
    insert into #temp select * from( select 
      (select cDepName from Department where cDepCode=cdept_id) as '辅助项部门', 
      (select cCusName from Customer where cCusCode=ccus_id) as '客户', 
      (select citemname from fitemss97 where fitemss97.citemcode=GL_accvouch.citem_id) as '项目名称', 
      cDefine2 as '辅助项的销售业务类别', 
      (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称', 
      md as '借方金额', 
      mc as '贷方金额'  from GL_accvouch  ) a --填充科目表 
    insert into @tempTable select * from 
        (select 
            (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称' 
        from GL_accvouch) aa 
    group by 科目名称 --取科目表行数 
    select @RowCount = count(*) from @tempTable --打开索引,循环向全局表中插入新列 
    open myCursor fetch next from myCursor into @ColumnName while @@fetch_status = 0 
    begin 
        alter table #temp add @ColumnName  nvarchar(50) default null
    end close myCursor 
    deallocate myCursor --返回全局表 
    select * from #tempdrop table  #temp
    试试
      

  5.   

    --定义全局临时表 
    declare @temp table(id int identity,辅助项部门 nvarchar(100),客户 nvarchar (100), 
        项目名称 nvarchar (100),辅助项的销售业务类别 nvarchar (100),科目名称 nvarchar (100), 
        借方金额 float ,贷方金额 float) 
    --定义科目表 
    declare @tempTable table( 科目名称 nvarchar (100)) 
    --定义科目表行数,行索引,定义列名,定义sql语句 
    declare @RowCount int, @RowIndex int ,@ColumnName nvarchar (50),@Sql nvarchar(1000) 
    --定义游标 
    declare myCursor Cursor for select * from @tempTable --填充全局数据表 
    insert into @temp select * from( select 
      (select cDepName from Department where cDepCode=cdept_id) as '辅助项部门', 
      (select cCusName from Customer where cCusCode=ccus_id) as '客户', 
      (select citemname from fitemss97 where fitemss97.citemcode=GL_accvouch.citem_id) as '项目名称', 
      cDefine2 as '辅助项的销售业务类别', 
      (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称', 
      md as '借方金额', 
      mc as '贷方金额'  from GL_accvouch  ) a --填充科目表 
    insert into @tempTable select * from 
        (select 
            (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称' 
        from GL_accvouch) aa 
    group by 科目名称 --取科目表行数 
    select @RowCount = count(*) from @tempTable --打开索引,循环向全局表中插入新列 
    open myCursor fetch next from myCursor into @ColumnName while @@fetch_status = 0 
    begin 
    --该字段名称可能为数字开头的。所有要转换。
        set @Sql = 'alter table @temp add [' + @ColumnName + '] nvarchar(50) default null' 
    --改的就是这句。
        print @Sql 
        exec(@sql) 
        fetch next from myCursor into @ColumnName 
    end close myCursor 
    deallocate myCursor --返回全局表 
    select * from @temp 
    //楼主请及时结贴哦。
      

  6.   

    set @Sql = 'alter table @temp add [' + @ColumnName + '] nvarchar(50) default null'
    --楼主请及时结贴哦
     
      

  7.   

    英雄,你终于来了,我试完了说
    消息 207,级别 16,状态 3,第 39 行
    列名 '#temp' 无效。还有begin  和 end 之间 要改成那个样子吗
      

  8.   

    你数据库表里的有些字段是NULL,定义临时表时那些字段定义成不能为空,所以往临时表里插入的数据的时候出错。
    不知道我的分析对不对,仅供参考
      

  9.   

    英雄,难道用#temp这个都不用定义表的结构吗
      

  10.   

    #temp是临时表,
    insert into #temp select * from( select 
      (select cDepName from Department where cDepCode=cdept_id) as '辅助项部门', 
      (select cCusName from Customer where cCusCode=ccus_id) as '客户', 
      (select citemname from fitemss97 where fitemss97.citemcode=GL_accvouch.citem_id) as '项目名称', 
      cDefine2 as '辅助项的销售业务类别', 
      (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称', 
      md as '借方金额', 
      mc as '贷方金额'  from GL_accvouch  ) a 
    就创建了表结构
      

  11.   

    --定义全局临时表 
    create table #temp  (id int identity,辅助项部门 nvarchar(100),客户 nvarchar (100), 
        项目名称 nvarchar (100),辅助项的销售业务类别 nvarchar (100),科目名称 nvarchar (100), 
        借方金额 float ,贷方金额 float) 
    --定义科目表 
    declare @tempTable table( 科目名称 nvarchar (100)) 
    --定义科目表行数,行索引,定义列名,定义sql语句 
    declare @RowCount int, @RowIndex int ,@ColumnName nvarchar (50),@Sql nvarchar(1000) 
    --定义游标 
    declare myCursor Cursor for select * from @tempTable --填充全局数据表 
    insert into #temp select * from( select 
      (select cDepName from Department where cDepCode=cdept_id) as '辅助项部门', 
      (select cCusName from Customer where cCusCode=ccus_id) as '客户', 
      (select citemname from fitemss97 where fitemss97.citemcode=GL_accvouch.citem_id) as '项目名称', 
      cDefine2 as '辅助项的销售业务类别', 
      (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称', 
      md as '借方金额', 
      mc as '贷方金额'  from GL_accvouch  ) a --填充科目表 
    insert into @tempTable select * from 
        (select 
            (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称' 
        from GL_accvouch) aa 
    group by 科目名称 --取科目表行数 
    select @RowCount = count(*) from @tempTable --打开索引,循环向全局表中插入新列 
    open myCursor fetch next from myCursor into @ColumnName while @@fetch_status = 0 
    begin 
        set @Sql = 'alter table #temp add ' + @ColumnName + ' nvarchar(50) default null' 
        print @Sql 
        exec(@sql) 
        fetch next from myCursor into @ColumnName 
    end close myCursor 
    deallocate myCursor --返回全局表 
    select * from #temp 
      

  12.   

    楼主先试试我那个,应该可以的。
    set @Sql = 'alter table @temp add [' + @ColumnName + '] nvarchar(50) default null'
      

  13.   


    不行啊,说@temp附近有语法错误,难道那个@temp是写在字符串里面的,还是写在外面啊,像这样
    'alter table  ‘ +@temp+ ’ 
      

  14.   

    set @Sql = 'alter table '+ @temp +' add [' + @ColumnName + '] nvarchar(50) default null' 
      

  15.   

    set @Sql = 'alter table #temp add  ['+@ColumnName+']  nvarchar(50) default null'
       exec(@Sql)
       FETCH NEXT FROM myCursor
    begin 和end之间修改为这个
      

  16.   

    那是这句:
    --填充全局数据表 
    insert into #temp select * from( select 
      (select cDepName from Department where cDepCode=cdept_id) as '辅助项部门', 
      (select cCusName from Customer where cCusCode=ccus_id) as '客户', 
      (select citemname from fitemss97 where fitemss97.citemcode=GL_accvouch.citem_id) as '项目名称', 
      cDefine2 as '辅助项的销售业务类别', 
      (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称', 
      md as '借方金额', 
      mc as '贷方金额'  from GL_accvouch  ) a 你去检查下数据,看看
    select 
      (select cDepName from Department where cDepCode=cdept_id) as '辅助项部门', 
      (select cCusName from Customer where cCusCode=ccus_id) as '客户', 
      (select citemname from fitemss97 where fitemss97.citemcode=GL_accvouch.citem_id) as '项目名称', 
      cDefine2 as '辅助项的销售业务类别', 
      (select ccode_name from code where code.ccode=GL_accvouch.ccode) as '科目名称', 
      md as '借方金额', 
      mc as '贷方金额'  from GL_accvouch
    得到什么,是否字段长度大于100了
      

  17.   

    或者md as '借方金额', 
      mc as '贷方金额' 不是float