如何将交叉表查询的结果写入ACCESS数据库?

irischenxi 2003-08-11 06:04:07
前两天写了一个存储过程时将交叉表查询结果写入一sql server表中,但因为此为一临时表,故想将它写入本地的一access数据库中,可否用一存储过程实现呢?若不能,最简单的实现方法是什么?

已写好的存储过程如下:

CREATE PROCEDURE dbo.Gen_T_EmployeePayrollDetail
AS
declare @sql varchar(8000)
set @sql='select employee_code'
select @sql=@sql+',sum(case when payroll_item_uuid='''+payroll_item_uuid+''' then amount end) ['+payroll_item_uuid+']'
from (select distinct payroll_item_uuid from employee_payroll_item_detail) a
set @sql=@sql+' into T_EmployeePayrollDetail from employee_payroll_item_detail group by employee_code'
exec (@sql)
GO

...全文
124 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccmoon 2003-08-12
  • 打赏
  • 举报
回复
另外
内存表需要定义啊
create table #tablename ....................
然后在select * into #tablename....
最后是返回rs用的为select * from #tablename
删除表drop #tablename
ccmoon 2003-08-12
  • 打赏
  • 举报
回复
@tbname是参数
你怎么又对传进去的参数付值?

irischenxi 2003-08-12
  • 打赏
  • 举报
回复
由存储过程返回表名参数,提示出错:

不正常地定义了参数对象,提供了不一致或不完整的信息!

我的存储过程如下:

CREATE PROCEDURE dbo.prGen_T_EmployeePayrollDetail
@tbname varchar(250) output
AS
declare @sql varchar(8000)
set @tbname='[T_EmployeePayrollDetail_'+cast(newid() as varchar(40))+']'
set @sql='select employee_uuid, employee_code, official_name, business_unit, department, year, period '
select @sql=@sql+',sum(case when payroll_item_uuid='''+payroll_item_uuid+''' then amount end) ['+payroll_item_uuid+']'
from (select distinct payroll_item_uuid from employee_payroll_item_detail) a
set @sql=@sql+' into '+@tbname+' from employee_payroll_item_detail where flag_payroll=1 and flag_person=1 group by employee_uuid, employee_code, official_name, business_unit, department, year, period '
exec (@sql)
GO

调用的VB代码如下

Private Sub Gen_T_EmployeePayrollDetail(ByRef TableName As String)
Dim strSQL As String
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
Dim param As New ADODB.Parameter

With cmd
.ActiveConnection = gobjConnection
.CommandText = "prGen_T_EmployeePayrollDetail"
.CommandType = adCmdStoredProc
Set param = cmd.CreateParameter("Output", adVarChar, adParamOutput, , 0)
.Parameters.Append param
End With

Set rst = cmd.Execute

TableName = cmd(0)

Set cmd = Nothing
rst.Close
Set rst = Nothing

End Sub

参数的定义哪里有错呢?
ccmoon 2003-08-12
  • 打赏
  • 举报
回复
1,两种模式都可以,建议由存储过程作
2,带#的也就是内存表,用完了要及时进行释放
irischenxi 2003-08-12
  • 打赏
  • 举报
回复
谢谢!我有两个问题:

1)我是用VB+SQL开发,几个客户端会同时操作数据库。以上存储过程会在vb中调用,我想有两种方法可以调用,一是由存储过程返回表名参数,二是将表名参数由vb生成,传给存储过程,那种方法更简单或可行呢?

2)以上存储过程是否可以用带#或##的临时表实现呢?

请各位指教!
irischenxi 2003-08-12
  • 打赏
  • 举报
回复
问题已解决,在CREATEPARAMETER()中加入第三个参数SIZE后,无错误提示,功能实现成功!谢谢大家!
irischenxi 2003-08-12
  • 打赏
  • 举报
回复
tablename是返回的值,即由存储过程产生的表名!
irischenxi 2003-08-12
  • 打赏
  • 举报
回复
可以讲的详细些吗?返回值究竟该如何取呢?output参数需要定义吗?如何定义呢?
我试过如下语句:

Set param = cmd.CreateParameter("Output", adVarChar, adParamOutput)

发生同样错误。
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
调用时用:
declare @tbname varchar(250)
exec Gen_T_EmployeePayrollDetail ,@tbname output

print '已经生成临时表:'+@tbname

--处理完成后删除全局临时表.
exec('drop table '+@tbname)
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
你的根本不是临时表,多个用户操作时当然会出问题.

看你的存储过程,你生成的表在存储过程后边还要调用到,是吧?
那就改用全局临时表:

CREATE PROCEDURE dbo.Gen_T_EmployeePayrollDetail
@tbname varchar(250) output --加一个输出参数,返回此存储生成的全局临时表的表名,以方便其他过程调用
AS
declare @sql varchar(8000)
set @tbname='[T_EmployeePayrollDetail_'+cast(newid() as varchar(40))+']' --生成一个临时表名
set @sql='select employee_code'
select @sql=@sql+',sum(case when payroll_item_uuid='''+payroll_item_uuid+''' then amount end) ['+payroll_item_uuid+']'
from (select distinct payroll_item_uuid from employee_payroll_item_detail) a
set @sql=@sql+' into '+@tbname+' from employee_payroll_item_detail group by employee_code'
exec (@sql)
GO

ccmoon 2003-08-11
  • 打赏
  • 举报
回复
应该会有问题
所以建议使用内存表
irischenxi 2003-08-11
  • 打赏
  • 举报
回复
用临时表可以吗?若同时有几个用户在使用,同时创建临时表,不会有问题吧!

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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