--函数
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER function [dbo].[getstrdataout] (@monthname nchar(9))
RETURNS nvarchar(1000) 
as
begin
declare @strSQL nvarchar(1000),@status nchar(4)
set @status='运行'  
set @strSQL='create table  ['+@monthname+']('
+'spbh int not null,spmch nchar(255),bmbh int not null,[1] int default 0,'
+'[2] int default 0,[3] int default 0,[4] int default 0,[5] int default 0,[6] int default 0,'
+'[7] int default 0,[8] int default 0,[9] int default 0,[10] int default 0,[11] int default 0,'
+'[12] int default 0,[13] int default 0,[14] int default 0,[15] int default 0,[16] int default 0,'
+'[17] int default 0,[18] int default 0,[19] int default 0,[20] int default 0,[21] int default 0,'
+'[22] int default 0,[23] int default 0,[24] int default 0,[25] int default 0,[26] int default 0,'
+'[27] int default 0,[28] int default 0,[29] int default 0,[30] int default 0,[31] int default 0 ,'
+'monthsales int default 0,yearsales int default 0,status nchar(4) default '+'运行'+')'
return @strSQL
end--存储过程
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER procedure [dbo].[createbase] @is_ct nchar(2) as
begin
---定义相关变量
---是否重新创建表,如果重新创建表会报现有的表与数据全部清空
if @is_ct='是'
begin--1创建表
--a.基础数据表sp 
if not exists(SELECT * FROM syb..SysObjects Where XType='U' and name='sp')
begin
create table sp(spid int not null primary key,spbh int not null ,spmch nchar(255),status nchar(4) default '可售'
    ,leixing int,[datetime0] datetime default getdate(),[datetime1] datetime default getdate())--0为启售日期,1 停售日期,当两个相同是从开始就启用了
end
else 
begin
--弹出消息告知已存在是否继续执行
drop table sp
create table sp(spid int not null primary key,spbh int not null ,spmch nchar(255),status nchar(4) default '可售'
    ,leixing int,[datetime0] datetime default getdate(),[datetime1] datetime default getdate())--0为启售日期,1 停售日期,当两个相同是从开始就启用了
end
exec sp_configure 'show advanced options',1  --配置操作不然会导入数据不成功
reconfigure 
exec sp_configure 'Ad Hoc Distributed Queries',1 
reconfigure
truncate table sp
insert into sp(spid,spbh,spmch,leixing) SELECT spid,spbh,spmch,leixing FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=K:\sybtg\基础资料\商品编号.xls;User ID=Admin;Password=;Extended properties="Excel 8.0;HDR=Yes;";Persist Security Info=False')...[sp$]
--b.基础数据表bm
if not exists(select * from syb..sysobjects where xtype='U' and name='bm')
begin  
create table bm(bmid int not null primary key,bmbh int not null ,bmmch nchar(255),status nchar(4) default '可用'
    ,[datetime0] datetime default getdate(),[datetime1] datetime default getdate())--0为启用日期,1 停用日期,当两个相同是从开始就启用了
end
else
begin
--弹出消息告知已存在是否继续执行
drop table bm
create table bm(bmid int not null primary key,bmbh int not null ,bmmch nchar(255),status nchar(4) default '可用'
    ,[datetime0] datetime default getdate(),[datetime1] datetime default getdate())--0为启用日期,1 停用日期,当两个相同是从开始就启用了
end
--同时在这导入部门基础数据
------------------------------------------------------------------------------------
--在这同上面一样用函数来调用就行了
------------------------------------------------------------------------------------
truncate table bm
insert into bm(bmid,bmbh,bmmch) SELECT bmid,bmbh,bmmch FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=K:\sybtg\基础资料\分店资料.xls;User ID=Admin;Password=;Extended properties="Excel 8.0;HDR=Yes;";Persist Security Info=False')...[bm$]
--b.基础数据表bmsp
if not exists(select * from syb..sysobjects where xtype='U' and name='bmsp')
begin
select spbh,bmbh into bmsp from sp,bm where sp.status='可售' and bm.status='可用' order by spbh,bmbh --用来取真实数据,如查当有sp,bm表时会报不存status无效 
end
else
begin
--弹出消息告知已存在是否继续执行
drop table bmsp
select spbh,bmbh into bmsp from sp,bm where sp.status='可售' and bm.status='可用' order by spbh,bmbh --用来取真实数据 
end
---对月份表的创建
declare @monthname nchar(9) ,@strSQL nvarchar(1000)
declare @i int,@ivar char(2)
set @monthname='dataout01'
set @i=0
while @i<12
begin
set @monthname=left(@monthname,7)
    set @ivar=datename ( month, dateadd(month, @i, getdate()) )
set @monthname=rtrim(ltrim(@monthname))+@ivar
if not exists(select * from syb..sysobjects where xtype='u' and name=@monthname)
begin
select @strSQL=dbo.getstrdataout(@monthname)--调用建表函数字串
EXEC sp_ExecuteSql @strSQL
set @strSQL='insert into ['+@monthname+'](spbh,spmch,bmbh)select a.spbh,b.spmch,a.bmbh from bmsp a,sp b where a.spbh=b.spbh order by spbh,bmbh'
EXEC sp_ExecuteSql @strSQL
end
else
begin
set @strSQL='drop table ['+@monthname+']'
EXEC sp_ExecuteSql @strSQL
select @strSQL=dbo.getstrdataout(@monthname)--调用建表函数字串
EXEC sp_ExecuteSql @strSQL
set @strSQL='insert into ['+@monthname+'](spbh,spmch,bmbh)select a.spbh,b.spmch,a.bmbh from bmsp a,sp b where a.spbh=b.spbh order by spbh,bmbh'
EXEC sp_ExecuteSql @strSQL
end
   set @i = @i + 1
end
return  0 --0值表示成功
end
else
return  1--是返回的整型值,(非整返回不了)除非特别指明,所有系统存储过程返回,0值表示成功,返回非零值则表示失败。end---入出参数说明,当输入参数为'是'才能进行创建,返回0表示操作成功,返回1表示操作失败
---今天要做的:3给sp,bm,增加一个状态重新来操作相关数据,给商品增加一个类别归属属性
--配置操作做成一个函数,由于在函数内的 'CONFIGURE' 中对带副作用的或依赖于时间的运算符的使用无效。

解决方案 »

  1.   

    --我把它换成整数型的就可以了
    ALTER function [dbo].[getstrdataout] (@monthname nchar(9))
    RETURNS nvarchar(1000)  
    as
    begin
    declare @strSQL nvarchar(1000),@status nchar(4)
    set @status='运行'   
    set @strSQL='create table ['+@monthname+']('
    +'spbh int not null,spmch nchar(255),bmbh int not null,[1] int default 0,'
    +'[2] int default 0,[3] int default 0,[4] int default 0,[5] int default 0,[6] int default 0,'
    +'[7] int default 0,[8] int default 0,[9] int default 0,[10] int default 0,[11] int default 0,'
    +'[12] int default 0,[13] int default 0,[14] int default 0,[15] int default 0,[16] int default 0,'
    +'[17] int default 0,[18] int default 0,[19] int default 0,[20] int default 0,[21] int default 0,'
    +'[22] int default 0,[23] int default 0,[24] int default 0,[25] int default 0,[26] int default 0,'
    +'[27] int default 0,[28] int default 0,[29] int default 0,[30] int default 0,[31] int default 0 ,'
    +'monthsales int default 0,yearsales int default 0,status int default 1)'
    return @strSQL
    end
      

  2.   

    --修改
    set @status=N'''运行'''  
    set @strSQL=N'create table ['+'test'+']('
    +'spbh int not null,spmch nchar(255),bmbh int not null,[1] int default 0,'
    +'[2] int default 0,[3] int default 0,[4] int default 0,[5] int default 0,[6] int default 0,'
    +'[7] int default 0,[8] int default 0,[9] int default 0,[10] int default 0,[11] int default 0,'
    +'[12] int default 0,[13] int default 0,[14] int default 0,[15] int default 0,[16] int default 0,'
    +'[17] int default 0,[18] int default 0,[19] int default 0,[20] int default 0,[21] int default 0,'
    +'[22] int default 0,[23] int default 0,[24] int default 0,[25] int default 0,[26] int default 0,'
    +'[27] int default 0,[28] int default 0,[29] int default 0,[30] int default 0,[31] int default 0 ,'
    +'monthsales int default 0,yearsales int default 0,status nchar(4) default '+@status+')'
      

  3.   

    --自己解决虽不明所以set ANSI_NULLS ON
    set QUOTED_IDENTIFIER off
    goALTER function [dbo].[getstrdataout] (@monthname nchar(9))
    RETURNS nvarchar(1000) 
    as
    begin
    declare @strSQL nvarchar(1000),@status nchar(4) 
    set @strSQL='create table  ['+@monthname+']('
    +'spbh int not null,spmch nchar(255),bmbh int not null,[1] int default 0,'
    +'[2] int default 0,[3] int default 0,[4] int default 0,[5] int default 0,[6] int default 0,'
    +'[7] int default 0,[8] int default 0,[9] int default 0,[10] int default 0,[11] int default 0,'
    +'[12] int default 0,[13] int default 0,[14] int default 0,[15] int default 0,[16] int default 0,'
    +'[17] int default 0,[18] int default 0,[19] int default 0,[20] int default 0,[21] int default 0,'
    +'[22] int default 0,[23] int default 0,[24] int default 0,[25] int default 0,[26] int default 0,'
    +'[27] int default 0,[28] int default 0,[29] int default 0,[30] int default 0,[31] int default 0 ,'
    +'monthsales int default 0,yearsales int default 0,status nchar(4) default '+"'运行'"+')'
    return @strSQL
    end
      

  4.   


    原因是在拼接动态SQL里字符的引号问题,在动态SQL里一个引号需要两个来实现。
      

  5.   

    想不明白的东西就print出来看看,拼这么多,难免会出错。
      

  6.   

    消息 9002,级别 17,状态 2,过程 createbase,第 21 行
    数据库 'syb' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
    消息 9002,级别 17,状态 2,过程 createbase,第 22 行
    数据库 'syb' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
    这个是什么原因????