ALTER  PROC dbo.proc_MovePost @servername sysname,@dt_begin datetime
AS
DECLARE @dt_end datetime,
@tbname sysname,
@s nvarchar(4000)
SELECT 
@dt_end = DATEADD(Month, 1, @dt_begin),
@tbname = QUOTENAME('post_' + CONVERT(char(6), @dt_begin, 112))
set @s = N'
select refindkey,0 as deleted into #movepost from '+ @servername+ N'.DataScrapeDBlocal.dbo.post where dateofpost>=Cast(@dt_begin as NVARCHAR(10))and dateofpost<Cast(@dt_end as NVARCHAR(10)) 
update a set deleted=1 from #movepost a inner join '+ @tbname+ N' b on a.refindkey =b.refindkey where b.refindkey is not null
insert into '+ @tbname+ N'(refindkey,firstextractiondate,latestextractiondate,threadid,subject,content,dateofpost,itemurl,poster,siteid,forumid,istopicpost)
select a.refindkey,a.firstextractiondate,a.latestextractiondate,a.threadid,a.subject,a.content,a.dateofpost,a.itemurl,a.poster,a.siteid,a.forumid,a.istopicpost 
from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null and b.deleted=0
delete from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null
drop table #movepost'
exec sp_executesql @s, N'@servername sysname,@dt_begin datetime, @dt_end datetime',@servername ,@dt_begin ,@dt_end GO
这个存储过程的问题是:
服务器: 消息 170,级别 15,状态 1,行 7
第 7 行: 'a' 附近有语法错误。

解决方案 »

  1.   

    ALTER  PROC dbo.proc_MovePost @servername sysname,@dt_begin datetime
    AS
    DECLARE @dt_end datetime,
    @tbname sysname,
    @s nvarchar(4000)
    SELECT 
    @dt_end = DATEADD(Month, 1, @dt_begin),
    @tbname = QUOTENAME('post_' + CONVERT(char(6), @dt_begin, 112))
    set @s = N'
    select refindkey,0 as deleted into #movepost from '+ @servername+ N'.DataScrapeDBlocal.dbo.post where dateofpost>=Cast(@dt_begin as NVARCHAR(10))and dateofpost<Cast(@dt_end as NVARCHAR(10)) 
    update a set deleted=1 from #movepost a inner join '+ @tbname+ N' b on a.refindkey =b.refindkey where b.refindkey is not null
    insert into '+ @tbname+ N'(refindkey,firstextractiondate,latestextractiondate,threadid,subject,content,dateofpost,itemurl,poster,siteid,forumid,istopicpost)
    select a.refindkey,a.firstextractiondate,a.latestextractiondate,a.threadid,a.subject,a.content,a.dateofpost,a.itemurl,a.poster,a.siteid,a.forumid,a.istopicpost 
    from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null and b.deleted=0
    delete a from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null
    drop table #movepost'
    exec sp_executesql @s, N'@servername sysname,@dt_begin datetime, @dt_end datetime',@servername ,@dt_begin ,@dt_end GO
    试一下
      

  2.   

    ALTER  PROC dbo.proc_MovePost @servername sysname,@dt_begin datetime
    AS
    DECLARE @dt_end datetime,
    @tbname sysname,
    @s nvarchar(4000)
    SELECT 
    @dt_end = DATEADD(Month, 1, @dt_begin),
    @tbname = QUOTENAME('post_' + CONVERT(char(6), @dt_begin, 112))
    set @s = N'
    select refindkey,0 as deleted into #movepost from '+ @servername+ N'.DataScrapeDBlocal.dbo.post where dateofpost>=Cast(@dt_begin as NVARCHAR(10))and dateofpost<Cast(@dt_end as NVARCHAR(10)) 
    update a set deleted=1 from #movepost a inner join '+ @tbname+ N' b on a.refindkey =b.refindkey where b.refindkey is not null
    insert into '+ @tbname+ N'(refindkey,firstextractiondate,latestextractiondate,threadid,subject,content,dateofpost,itemurl,poster,siteid,forumid,istopicpost)
    select a.refindkey,a.firstextractiondate,a.latestextractiondate,a.threadid,a.subject,a.content,a.dateofpost,a.itemurl,a.poster,a.siteid,a.forumid,a.istopicpost 
    from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null and b.deleted=0
    delete from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null
    drop table #movepost'
    exec sp_executesql @s, N'@servername sysname,@dt_begin datetime, @dt_end datetime',N'@dt_begin datetime,@dt_end datetime',@dt_begin ,@dt_end GO
      

  3.   

    最后这个写错了
    exec sp_executesql @s, N'@servername sysname,@dt_begin datetime, @dt_end datetime',N'@dt_begin datetime,@dt_end datetime',@dt_begin ,@dt_end 
    应该是
    exec sp_executesql @s, N'@dt_begin datetime,@dt_end datetime',@dt_begin ,@dt_end
      

  4.   

    --这样试一下看看
    ALTER  PROC dbo.proc_MovePost @servername sysname,@dt_begin datetime
    AS
    DECLARE @dt_end datetime,
    @tbname sysname,
    @s nvarchar(4000)SELECT 
    @dt_end = DATEADD(Month, 1, @dt_begin),
    @tbname = QUOTENAME('post_' + CONVERT(char(6), @dt_begin, 112))set @s = N'
    select refindkey,0 as deleted into #movepost from '+ @servername+ N'.DataScrapeDBlocal.dbo.post where dateofpost>=''' + convert(NVARCHAR(10),@dt_begin,112) + ''' and dateofpost<''' + convert(NVARCHAR(10),@dt_end,112) + 
    + ''' update a set deleted=1 from #movepost a inner join '+ @tbname+ N' b on a.refindkey =b.refindkey where b.refindkey is not null
    insert into '+ @tbname+ N'(refindkey,firstextractiondate,latestextractiondate,threadid,subject,content,dateofpost,itemurl,poster,siteid,forumid,istopicpost)
    select a.refindkey,a.firstextractiondate,a.latestextractiondate,a.threadid,a.subject,a.content,a.dateofpost,a.itemurl,a.poster,a.siteid,a.forumid,a.istopicpost 
    from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null and b.deleted=0
    delete a from '+@servername+N'.DataScrapeDBlocal.dbo.post a inner join #movepost b on a.refindkey=b.refindkey where b.refindkey is not null
    drop table #movepost'
    exec @s
    GO
      

  5.   

    楼主,你把@s变量print出来,然后贴上来看看?