2013-11-04 34 views
1

我试图插入查询结果到表中使用'Insert Into' xxx(col1, col2, col3...) values(....),但得到语法错误'不正确的语法靠近关键字'与'。如果这个语句是一个公用表表达式,一个xmlnamespaces子句或一个变更跟踪上下文子句,则前面的语句必须以分号结束。Sql Server2008:插入不起作用,得到错误

任何想法如何使用'插入'与这样的复杂查询? 请注意'与Rownumbers ..'查询工作,并返回一个准确的结果,只是错误,当我尝试插入该结果。

INSERT INTO Cost(Name, [Status], [Hours]) values(
with RowNumbers (RowNum, name, [status], [DateTime]) 
as 
(
    select 
     ROW_NUMBER() over (partition by name order by [DateTime]), 
     name, 
     [status], 
     [DateTime] 
    from @T 
) 
select 
    T1.name, 
    case T1.[status] 
     when 0 then 'In' 
     when 1 then 'Out' 
     when 2 then 'Absent' 
     end as [status], 
    sum(datediff(MINUTE, T1.[DateTime], T2.[DateTime])/60.0) as [hours] 
from RowNumbers T1 
    inner join RowNumbers T2 
     on T1.RowNum = T2.RowNum - 1 -- joins the current row to the next one 
     and T1.name = T2.name 
group by T1.name, T1.[status] 
order by T1.Name, T1.[status]); 

回答

1

您应该考虑将status列设置为smallint,而不是浪费存储varchar的空间。然后制作另一个表来描述这个varchar(标准化数据)。

我重写你的SQL有点这样的语法是有效的,数计算更准确:

;with RowNumbers (RowNum, name, [status], [DateTime]) 
as 
(
    select 
     ROW_NUMBER() over (partition by name order by [DateTime]), 
     name, 
     [status], 
     [DateTime] 
    from @T 
) 
INSERT INTO Cost(Name, [Status], [Hours]) 
select 
    T1.name, 
    case T1.[status] 
     when 0 then 'In' 
     when 1 then 'Out' 
     when 2 then 'Absent' 
     end as [status], 
    datediff(MINUTE, 0, T2.[DateTime]-T1.[DateTime])/60.0 as [hours] 
from RowNumbers T1 
    inner join RowNumbers T2 
     on T1.RowNum = T2.RowNum - 1 -- joins the current row to the next one 
     and T1.name = T2.name 
order by T1.Name, T1.[status]; 
1

您的查询需要转换的方式如下:

; 
with RowNumbers (RowNum, name, [status], [DateTime]) 
as 
(
    select 
     ROW_NUMBER() over (partition by name order by [DateTime]), 
     name, 
     [status], 
     [DateTime] 
    from @T 
) 
INSERT INTO Cost(Name, [Status], [Hours]) values(
select 
    T1.name, 
    case T1.[status] 
     when 0 then 'In' 
     when 1 then 'Out' 
     when 2 then 'Absent' 
     end as [status], 
    sum(datediff(MINUTE, T1.[DateTime], T2.[DateTime])/60.0) as [hours] 
from RowNumbers T1 
    inner join RowNumbers T2 
     on T1.RowNum = T2.RowNum - 1 -- joins the current row to the next one 
     and T1.name = T2.name 
group by T1.name, T1.[status] 
order by T1.Name, T1.[status]); 

CTE必须在INSERT语句之前的定义。

查看链接http://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspxhttp://technet.microsoft.com/en-us/library/ms175972(v=sql.105).aspx了解更深的CTE。