用sql脚本一条条导数据的两种方法,需返回唯一标识@@IDENTITY作为插入到第二个表用。...

因为实际需求需要用sql脚本导数据到另一个表中,且必须返回一个@@IDENTITY的唯一标识。
作为插入到另一个表的字段用。
比如说新闻,有newstitlenote表和newdetail表,分别存放的是基本信息和新闻详细内容
为了保持数据同步所以必须返回唯一标识一条条插入,而不能用insert into...select...
这里用了两种方法:
1游标
SET  ANSI_NULLS  OFF
GO
SET  QUOTED_IDENTIFIER  ON
GO
-- 唯一标识
declare   @currentvalue   int  

declare   @isshow   int = 0
declare   @cur_checkdate   datetime
declare   @cur_newsline   varchar ( 200 )
declare   @cur_quarry   varchar ( 50 )
declare   @cur_parentid   int  

declare  cur_custer  cursor
for   
select   [ newsday ] , [ newsline ] , [ Quarry ] , [ newstype ]   from   [ News_Fund_Content ]   where  newstype = 4   order   by  newsday  desc
-- 打开游标
open  cur_custer
-- 读取一行
fetch  cur_custer  into   @cur_checkdate , @cur_newsline , @cur_quarry , @cur_parentid
while  ( @@fetch_status   = 0 )
    
begin  
        
insert   into    [ news_title_note ] ( [ check_date ] , [ newsline ] , [ Quarry ] , [ isshow ] , [ parentid ] )
        
values  (  @cur_checkdate , @cur_newsline , @cur_quarry ,, @isshow , @cur_parentid )
        
select   @currentvalue   =   @@IDENTITY
        
-- 唯一标识用作插入到news_classlist用
         print   @currentvalue
        
INSERT   INTO   [ dbo ] . [ news_classlist ] ( [ noteid ] , [ classname ] , [ parentid ] )
        
values   (  @currentvalue , @classname , @newstype )
        
fetch  cur_custer  into   @cur_checkdate , @cur_newsline , @cur_quarry , @cur_parentid
    
end
-- 关闭游标
close  cur_custer
-- 撤销游标
deallocate  cur_custer

2创建临时表查一条删一条
SET  ANSI_NULLS  OFF
GO
SET  QUOTED_IDENTIFIER  ON
GO

create   table  #news
(
    newsday 
datetime ,
    newsline 
varchar ( 100 ),
    quarry 
varchar ( 50 ),
    newstype 
int
)
-- 把所有数据导入到临时表中
insert   into  #news  select   [ newsday ] , [ newsline ] , [ Quarry ] , [ newstype ]   from   [ News_Fund_Content ]   where  newstype = 4
declare   @newsday   datetime
declare   @quarry   varchar ( 50 )
declare   @newsline   varchar ( 100 )
declare   @newstype   int  
declare   @isshow   int = 0
declare   @classname   varchar ( 50 )
set   @classname   =   ' 后勤 '
-- 返回唯一标识
declare   @currentvalue   int


while  ( select   count ( 1 from  #news  where  newstype = 4 >   0
    
begin
        
set   @newsday   =   select   top   1   @newsday   =   [ newsday ] @quarry   =   [ quarry ] @newsline = [ newsline ]  ,  @newstype = [ newstype ]  
        
from  #news  order   by  newsday  desc
        
insert   into   [ news_title_note ] ( [ check_date ] , [ newsline ] , [ Quarry ] , [ isshow ] , [ parentid ]
        
values  (  @newsday , @newsline , @quarry , @isshow , @newstype )
        
-- 取唯一标识用作下个表的插入
         select   @currentvalue   =   @@IDENTITY
        
print   @currentvalue
        
INSERT   INTO   [ dbo ] . [ news_classlist ] ( [ noteid ] , [ classname ] , [ parentid ] )
        
values   (  @currentvalue , @classname , @newstype )
        
-- 在临时表中删除这条新闻
         delete  #news  where  newsline  =   @newsline
    
end

3当然还可以用程序写~。
只不过觉得比较麻烦还得建个项目啥的。

遇到text字段无法导入的问题,在博问中请教了下,
有说设定@newscontent 时设定为varchar并且设定的范围大点可解决导入text字段的问题。
试试再说~先谢过~

网上说游标比较慢,具体自己没有测试过,所以先推荐第二种方法吧。
欢迎讨论指正~


转载于:https://www.cnblogs.com/junyistar/archive/2008/03/12/1102519.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值