sql 求救 高手来

symbol_bc 2009-09-17 04:48:34
--定义全局临时表
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


执行时报错
(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'。
...全文
146 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
或者md as '借方金额',
mc as '贷方金额' 不是float
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 symbol_bc 的回复:]
引用 18 楼 ncjcz 的回复:
SQL code--定义全局临时表createtable #temp  (idintidentity,辅助项部门nvarchar(100),客户nvarchar (100),
    项目名称nvarchar (100),辅助项的销售业务类别nvarchar (100),科目名称nvarchar (100),
    借方金额float ,贷方金额float)--定义科目表declare@te¡­


这个厉害,感觉差不多了,但是说
消息 213,级别 16,状态 4,第 17 行
插入错误: 列名或所提供值的数目与表定义不匹配。
[/Quote]
那是这句:
--填充全局数据表
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了
mbh0210 2009-09-17
  • 打赏
  • 举报
回复


set @Sql = 'alter table #temp add ['+@ColumnName+'] nvarchar(50) default null'
exec(@Sql)
FETCH NEXT FROM myCursor


begin 和end之间修改为这个
chenjianyong94 2009-09-17
  • 打赏
  • 举报
回复
其实几种写法都是一样的。只不过方法变了。问题解决之后,请及时结贴。
symbol_bc 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 chenjianyong94 的回复:]
这个应该可以的。还是不行的话,我就不行了,测试成功通过了。
[/Quote]

谢谢你,不过我感觉还是18楼的代码对
symbol_bc 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ncjcz 的回复:]
SQL code--定义全局临时表createtable #temp (idintidentity,辅助项部门nvarchar(100),客户nvarchar (100),
项目名称nvarchar (100),辅助项的销售业务类别nvarchar (100),科目名称nvarchar (100),
借方金额float ,贷方金额float)--定义科目表declare@te¡­
[/Quote]

这个厉害,感觉差不多了,但是说
消息 213,级别 16,状态 4,第 17 行
插入错误: 列名或所提供值的数目与表定义不匹配。
chenjianyong94 2009-09-17
  • 打赏
  • 举报
回复
这个应该可以的。还是不行的话,我就不行了,测试成功通过了。
chenjianyong94 2009-09-17
  • 打赏
  • 举报
回复
set @Sql = 'alter table '+ @temp +' add [' + @ColumnName + '] nvarchar(50) default null' 
symbol_bc 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chenjianyong94 的回复:]
SQL codeset@Sql='alter table @temp add ['+@ColumnName+'] nvarchar(50) default null'--楼主请及时结贴哦
[/Quote]

不行啊,说@temp附近有语法错误,难道那个@temp是写在字符串里面的,还是写在外面啊,像这样
'alter table ‘ +@temp+ ’
chenjianyong94 2009-09-17
  • 打赏
  • 举报
回复
楼主先试试我那个,应该可以的。
set @Sql = 'alter table @temp add [' + @ColumnName + '] nvarchar(50) default null'
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
--定义全局临时表 
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
mbh0210 2009-09-17
  • 打赏
  • 举报
回复
#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
就创建了表结构
kaukiyou 2009-09-17
  • 打赏
  • 举报
回复
这,整理下再发贴吧。
symbol_bc 2009-09-17
  • 打赏
  • 举报
回复
英雄,难道用#temp这个都不用定义表的结构吗
gudongxing 2009-09-17
  • 打赏
  • 举报
回复
晕,看样子我错了~
symbol_bc 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chenjianyong94 的回复:]
SQL codeset@Sql='alter table @temp add ['+@ColumnName+'] nvarchar(50) default null'--楼主请及时结贴哦
[/Quote]


你放心,你要是能把我这个问题解决了,我就是把分都给你我也愿意
gudongxing 2009-09-17
  • 打赏
  • 举报
回复
你数据库表里的有些字段是NULL,定义临时表时那些字段定义成不能为空,所以往临时表里插入的数据的时候出错。
不知道我的分析对不对,仅供参考
symbol_bc 2009-09-17
  • 打赏
  • 举报
回复
英雄,你终于来了,我试完了说
消息 207,级别 16,状态 3,第 39 行
列名 '#temp' 无效。

还有begin 和 end 之间 要改成那个样子吗
chenjianyong94 2009-09-17
  • 打赏
  • 举报
回复
set @Sql = 'alter table @temp add [' + @ColumnName + '] nvarchar(50) default null'
--楼主请及时结贴哦
chenjianyong94 2009-09-17
  • 打赏
  • 举报
回复
--定义全局临时表 
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



//楼主请及时结贴哦。
加载更多回复(8)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧