游标插入

buzhunmeiyouni 2017-11-27 09:08:27
ALTER PROC [dbo].[p_yb]
AS
declare @name varchar(100)
declare @sql varchar(2000)
declare table_import cursor for
SELECT 课程名称 FROM a3
open table_import
fetch next from table_import into @name--匹配第一条记录
while (@@FETCH_STATUS=0)-- 读取游标状态,循环
begin
set @sql='
insert into t_item(FItemID,FItemClassID,FExternID,FNumber,FParentID,FLevel,FDetail,FName,FUnUsed,FBrNo,FFullNumber,FDiff,FDeleted
,FShortNumber,FFullName,UUID,FGRCommonID,FSystemType,FUseSign,FChkUserID,FAccessory,FGrControl,FHavePicture)
select fitemid+ROW_NUMBER() over (order by 编号),
3003,-1,
right(''000''+CAST(fnumber+ROW_NUMBER() over (order by 编号) as varchar),3),
0,1,1,
'''+@name+''',
0,0,
right(''000''+CAST(fnumber+ROW_NUMBER() over (order by 编号) as varchar),3),
0,0,
right(''000''+CAST(fnumber+ROW_NUMBER() over (order by 编号) as varchar),3),
'''+@name+''',
NEWID(),-1,1,0,null,0,-1,0
from a3
join (select MAX(fitemid) as fitemid FROM t_item) as B on 1=1
join (select MAX(cast(fnumber as int)) as fnumber from t_item_3003) as c on 1=1
'
print(@sql)
exec(@sql)
fetch next from table_import into @name
END


问题是SELECT 课程名称 FROM a3 这个语局查询出来的值是

怎么只把相同 的值只插入一遍
...全文
320 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复
问题搞定了,谢谢大家
听雨停了 2017-11-27
  • 打赏
  • 举报
回复
引用 15 楼 buzhunmeiyouni 的回复:
CREATE TABLE aa( id int, fnumber VARCHAR(20), tname VARCHAR(20), cname VARCHAR(20) ) INSERT INTO aa VALUES(1,'001','3001','三十三') INSERT INTO aa VALUES(2,'002','3001','发生的') INSERT INTO aa VALUES(3,'001','3002','沃尔沃') INSERT INTO aa VALUES(4,'002','3002','烘干机f') INSERT INTO aa VALUES(5,'001','3003','eeee') INSERT INTO aa VALUES(6,'002','3003','gfgg') 这个是原表 插入数据后要求这样
看你的结果是根据tname 分组来自增这个fnumber,但是你这个语句select MAX(cast(fnumber as int)) as fnumber from t_item_3003并没有根据tname来group啊。在这个语句里价格group by试试。然后把上面的+ ROW_NUMBER() OVER ( ORDER BY 编号 )都改成+1就应该可以了,当然你的游标创建的时候得先渠道这个tname,因为要按照这个值来取他的最大fnumber
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复
CREATE TABLE aa(
id int,
fnumber VARCHAR(20),
tname VARCHAR(20),
cname VARCHAR(20)
)
INSERT INTO aa VALUES(1,'001','3001','三十三')
INSERT INTO aa VALUES(2,'002','3001','发生的')
INSERT INTO aa VALUES(3,'001','3002','沃尔沃')
INSERT INTO aa VALUES(4,'002','3002','烘干机f')
INSERT INTO aa VALUES(5,'001','3003','eeee')
INSERT INTO aa VALUES(6,'002','3003','gfgg')

这个是原表


插入数据后要求这样
中国风 2017-11-27
  • 打赏
  • 举报
回复
用以下方法测测 DISTINCT --用a3分别过滤2次调用 用这一段执行有没有重复,如果有重复,需根据自己的需求处理显示效果,如用GROUP BY +MAX,处理只显示一行
(SELECT DISTINCT fitemid,fnumber,编号 FROM a3)
ALTER PROC [dbo].[p_yb]
AS
    DECLARE @name VARCHAR(100);
    DECLARE @sql VARCHAR(2000);
    DECLARE table_import CURSOR
    FOR
        SELECT  DISTINCT 课程名称
        FROM    a3; 
    OPEN table_import;
    FETCH NEXT FROM table_import INTO @name;--匹配第一条记录	
    WHILE ( @@FETCH_STATUS = 0 )-- 读取游标状态,循环
        BEGIN
            SET @sql = 'INSERT  INTO t_item
        ( FItemID ,
          FItemClassID ,
          FExternID ,
          FNumber ,
          FParentID ,
          FLevel ,
          FDetail ,
          FName ,
          FUnUsed ,
          FBrNo ,
          FFullNumber ,
          FDiff ,
          FDeleted ,
          FShortNumber ,
          FFullName ,
          UUID ,
          FGRCommonID ,
          FSystemType ,
          FUseSign ,
          FChkUserID ,
          FAccessory ,
          FGrControl ,
          FHavePicture
        )
        SELECT  fitemid + ROW_NUMBER() OVER ( ORDER BY 编号 ) ,
                3003 ,
                -1 ,
                RIGHT(''000''
                      + CAST(fnumber + ROW_NUMBER() OVER ( ORDER BY 编号 ) AS VARCHAR),
                      3) ,
                0 ,
                1 ,
                1 ,
                 '''+@name+''' ,
                0 ,
                0 ,
                RIGHT(''000''
                      + CAST(fnumber + ROW_NUMBER() OVER ( ORDER BY 编号 ) AS VARCHAR),
                      3) ,
                0 ,
                0 ,
                RIGHT(''000''
                      + CAST(fnumber + ROW_NUMBER() OVER ( ORDER BY 编号 ) AS VARCHAR),
                      3) ,
                '''+@name+''' ,
                NEWID() ,
                -1 ,
                1 ,
                0 ,
                NULL ,
                0 ,
                -1 ,
                0
        FROM    (SELECT DISTINCT fitemid,fnumber,编号 FROM a3)AS a3
                CROSS JOIN ( SELECT   MAX(fitemid) AS fitemid
                       FROM     t_item
                     ) AS B 
                CROSS JOIN ( SELECT   MAX(CAST(fnumber AS INT)) AS fnumber
                       FROM     t_item_3003
                     ) AS c ;'
;
            PRINT ( @sql );
            EXEC(@sql);
            FETCH NEXT FROM table_import INTO @name; 
        END;
听雨停了 2017-11-27
  • 打赏
  • 举报
回复
引用 11 楼 buzhunmeiyouni 的回复:
如果这样写为什么as 会错
把你的cast这里面的select字句用()括起来。而且得保证查询出来的结果是一条记录才行
听雨停了 2017-11-27
  • 打赏
  • 举报
回复
引用 9 楼 buzhunmeiyouni 的回复:
[quote=引用 7 楼 qq_37170555 的回复:] [quote=引用 5 楼 qq_37170555 的回复:] [quote=引用 4 楼 buzhunmeiyouni 的回复:] [quote=引用 3 楼 qq_37170555 的回复:]

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
这个我加过。查询出来是一条,但是执行却执行了两遍[/quote] 你的意思是美术课,体育课在你插入的表中只要一条记录是吗?[/quote] 如果是上面我说的这个意思,那就就没必要用row_number()这个函数了。之所以你用了distinct也会重复插入,就是因为你用了row_number()over(partition by 编号)。我看你的a3查询出来有四条记录,那你的编号也就会有四个,这样你用row_number的话就会有四条重复的记录进去了。

ALTER PROC [dbo].[p_yb]
AS
declare @name varchar(100)
declare @sql varchar(2000)
declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
open table_import
fetch next from table_import into @name--匹配第一条记录	
while (@@FETCH_STATUS=0)-- 读取游标状态,循环
begin
set @sql='
insert into t_item(FItemID,FItemClassID,FExternID,FNumber,FParentID,FLevel,FDetail,FName,FUnUsed,FBrNo,FFullNumber,FDiff,FDeleted
,FShortNumber,FFullName,UUID,FGRCommonID,FSystemType,FUseSign,FChkUserID,FAccessory,FGrControl,FHavePicture)
select fitemid+1,
       3003,-1,
       right(''000''+CAST(fnumber+1 as varchar),3),
       0,1,1,
       '''+@name+''',
       0,0,
       right(''000''+CAST(fnumber+1 as varchar),3),
       0,0,
       right(''000''+CAST(fnumber+1 as varchar),3),
       '''+@name+''',
       NEWID(),-1,1,0,null,0,-1,0
      from a3
join (select MAX(fitemid) as fitemid FROM t_item) as B on 1=1
join (select MAX(cast(fnumber as int)) as fnumber from t_item_3003) as c on 1=1
'
print(@sql)
exec(@sql)
fetch next from table_import into @name 
END
我的建议是直接把row_number改成1。其实我更觉得没必要加这个1,因为每个课程就一条记录的话,加不加有啥区别。也就是直接去掉这个row_number()就可以了[/quote] 第一个字段可以不用,但是其他的字段还是要用,而且按着你这样执行,查询出来的结果是两条一样的值,还是不行 [/quote] 有点被你搞蒙了,既然你说每个课程只要一条记录,对吧。那你用这个row_number() over(partition by 编号)有什么作用呢,你希望这个row_number() over(partition by 编号)出来的值是多少啊,它永远都是从1开始到你的编号结束,加入你整个表有四条记录,那这个row_number() over(partition by 编号)就会是1到4,你查询出来的结果也就是四条。也就是你插入的结果。但是你又说要一条。具体你需要做什么呢,达成什么效果。建议给点测试数据。你下面给的表截图数据,我说的我也不是很明白。你说fnumber是每个表的独立的,可是我看这个值也有很多重复的啊
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复


如果这样写为什么as 会错
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复


要插入的表是这样的,他是几个表的全部值,他的fnumber 是每个表的独立的
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复
引用 7 楼 qq_37170555 的回复:
[quote=引用 5 楼 qq_37170555 的回复:] [quote=引用 4 楼 buzhunmeiyouni 的回复:] [quote=引用 3 楼 qq_37170555 的回复:]

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
这个我加过。查询出来是一条,但是执行却执行了两遍[/quote] 你的意思是美术课,体育课在你插入的表中只要一条记录是吗?[/quote] 如果是上面我说的这个意思,那就就没必要用row_number()这个函数了。之所以你用了distinct也会重复插入,就是因为你用了row_number()over(partition by 编号)。我看你的a3查询出来有四条记录,那你的编号也就会有四个,这样你用row_number的话就会有四条重复的记录进去了。

ALTER PROC [dbo].[p_yb]
AS
declare @name varchar(100)
declare @sql varchar(2000)
declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
open table_import
fetch next from table_import into @name--匹配第一条记录	
while (@@FETCH_STATUS=0)-- 读取游标状态,循环
begin
set @sql='
insert into t_item(FItemID,FItemClassID,FExternID,FNumber,FParentID,FLevel,FDetail,FName,FUnUsed,FBrNo,FFullNumber,FDiff,FDeleted
,FShortNumber,FFullName,UUID,FGRCommonID,FSystemType,FUseSign,FChkUserID,FAccessory,FGrControl,FHavePicture)
select fitemid+1,
       3003,-1,
       right(''000''+CAST(fnumber+1 as varchar),3),
       0,1,1,
       '''+@name+''',
       0,0,
       right(''000''+CAST(fnumber+1 as varchar),3),
       0,0,
       right(''000''+CAST(fnumber+1 as varchar),3),
       '''+@name+''',
       NEWID(),-1,1,0,null,0,-1,0
      from a3
join (select MAX(fitemid) as fitemid FROM t_item) as B on 1=1
join (select MAX(cast(fnumber as int)) as fnumber from t_item_3003) as c on 1=1
'
print(@sql)
exec(@sql)
fetch next from table_import into @name 
END
我的建议是直接把row_number改成1。其实我更觉得没必要加这个1,因为每个课程就一条记录的话,加不加有啥区别。也就是直接去掉这个row_number()就可以了[/quote] 第一个字段可以不用,但是其他的字段还是要用,而且按着你这样执行,查询出来的结果是两条一样的值,还是不行
听雨停了 2017-11-27
  • 打赏
  • 举报
回复
引用 6 楼 buzhunmeiyouni 的回复:
[quote=引用 5 楼 qq_37170555 的回复:] [quote=引用 4 楼 buzhunmeiyouni 的回复:] [quote=引用 3 楼 qq_37170555 的回复:]

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
这个我加过。查询出来是一条,但是执行却执行了两遍[/quote] 你的意思是美术课,体育课在你插入的表中只要一条记录是吗?[/quote] 对,就是这样[/quote] 看上面那个回复
听雨停了 2017-11-27
  • 打赏
  • 举报
回复
引用 5 楼 qq_37170555 的回复:
[quote=引用 4 楼 buzhunmeiyouni 的回复:] [quote=引用 3 楼 qq_37170555 的回复:]

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
这个我加过。查询出来是一条,但是执行却执行了两遍[/quote] 你的意思是美术课,体育课在你插入的表中只要一条记录是吗?[/quote] 如果是上面我说的这个意思,那就就没必要用row_number()这个函数了。之所以你用了distinct也会重复插入,就是因为你用了row_number()over(partition by 编号)。我看你的a3查询出来有四条记录,那你的编号也就会有四个,这样你用row_number的话就会有四条重复的记录进去了。

ALTER PROC [dbo].[p_yb]
AS
declare @name varchar(100)
declare @sql varchar(2000)
declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
open table_import
fetch next from table_import into @name--匹配第一条记录	
while (@@FETCH_STATUS=0)-- 读取游标状态,循环
begin
set @sql='
insert into t_item(FItemID,FItemClassID,FExternID,FNumber,FParentID,FLevel,FDetail,FName,FUnUsed,FBrNo,FFullNumber,FDiff,FDeleted
,FShortNumber,FFullName,UUID,FGRCommonID,FSystemType,FUseSign,FChkUserID,FAccessory,FGrControl,FHavePicture)
select fitemid+1,
       3003,-1,
       right(''000''+CAST(fnumber+1 as varchar),3),
       0,1,1,
       '''+@name+''',
       0,0,
       right(''000''+CAST(fnumber+1 as varchar),3),
       0,0,
       right(''000''+CAST(fnumber+1 as varchar),3),
       '''+@name+''',
       NEWID(),-1,1,0,null,0,-1,0
      from a3
join (select MAX(fitemid) as fitemid FROM t_item) as B on 1=1
join (select MAX(cast(fnumber as int)) as fnumber from t_item_3003) as c on 1=1
'
print(@sql)
exec(@sql)
fetch next from table_import into @name 
END
我的建议是直接把row_number改成1。其实我更觉得没必要加这个1,因为每个课程就一条记录的话,加不加有啥区别。也就是直接去掉这个row_number()就可以了
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复
引用 5 楼 qq_37170555 的回复:
[quote=引用 4 楼 buzhunmeiyouni 的回复:] [quote=引用 3 楼 qq_37170555 的回复:]

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
这个我加过。查询出来是一条,但是执行却执行了两遍[/quote] 你的意思是美术课,体育课在你插入的表中只要一条记录是吗?[/quote] 对,就是这样
听雨停了 2017-11-27
  • 打赏
  • 举报
回复
引用 4 楼 buzhunmeiyouni 的回复:
[quote=引用 3 楼 qq_37170555 的回复:]

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
这个我加过。查询出来是一条,但是执行却执行了两遍[/quote] 你的意思是美术课,体育课在你插入的表中只要一条记录是吗?
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复
引用 3 楼 qq_37170555 的回复:

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
这个我加过。查询出来是一条,但是执行却执行了两遍
听雨停了 2017-11-27
  • 打赏
  • 举报
回复

declare table_import cursor for
SELECT distinct 课程名称 FROM a3 
在创建游标的时候加一个distinct
buzhunmeiyouni 2017-11-27
  • 打赏
  • 举报
回复
引用 1 楼 superwfei 的回复:
你拼接的语句中加个条件 and not exists(select top 1 name from t_item where name=@name)
加了不行啊
文盲老顾 2017-11-27
  • 打赏
  • 举报
回复
你拼接的语句中加个条件 and not exists(select top 1 name from t_item where name=@name)

588

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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