这段代码有什么问题

时间:2018-07-20 07:10:04

标签: sql sql-server sql-server-2008 plsql

  declare 
cursor c_pointage is select * from pointage;
v_pointage c_pointage%rowtype;
v_date nvarchar;
v_heures int ; 
v_minutes int ; 
begin 
for v_pointage in c_pointage loop 
v_date:= CONVERT(varchar(10), v_pointage.DateHeureArrivee, 120) ;
v_heures := DATEPART(hour, v_pointage.DateHeureArrivee);
v_minutes := DATEPART(minute, v_pointage.DateHeureArrivee);
insert into Calc_pointage values ( v_pointage.ID, v_pointage.Nom, v_pointage.Departement, v_pointage.NumCarte, v_pointage.IDterminale, v_pointage.NomTerminale, v_pointage.IDInOut,v_date,v_heures,v_minutes);
end loop;
end ;

我不断遇到这些错误:

关键字“光标”附近的语法不正确。

第15层,状态1,第3行,消息102

'v_pointage'附近的语法不正确。

第15层状态1的第13行,消息102

“循环”附近的语法不正确。

ps:我要从中插入的表中的数据类型与我要插入到的表中的数据相匹配

1 个答案:

答案 0 :(得分:1)

您根本不应该为此写一个 cursor INSERT ... SELECT应该做好这项工作:

insert into Calc_pointage (/*TODO - Column list */)
select
    ID, Nom, Departement, NumCarte, IDterminale, NomTerminale, IDInOut,
    CONVERT(varchar(10), DateHeureArrivee, 120), --Ideally, CONVERT(date,DateHeureArrivee) instead
    DATEPART(hour, DateHeureArrivee),
    DATEPART(minute, DateHeureArrivee)
FROM pointage

但是现在我看一下,这也很明显地体现出您决定将一个过程分解为一系列 procedural 步骤(为什么您只是复制一个步骤表到另一个表中?),而整个事情可能只是作为{em>单个基于集合的查询的一部分的CTE


在过渡到编写SQL时,引起您注意的关键是“思考集合”。尝试使用 not 分解问题,或者至少不要将其分解为 loop 以及如何一次处理单行 >。如果您的输入数据与您想要的数据不同,请考虑将如何将整个行集转换为更类似于您要查找的行集。然后编写一个进行该转换的CTE,然后从那里构建。