2013-03-28 3 views
0

Я задаюсь вопросом, почему я не могу создать следующую функцию T-SQL:T_SQL Функция с «с» пункта

CREATE FUNCTION DaysIncarceratedInYear 
--Requires a Patient ID and a year 
-- will return the number of days the patient was incarcerated for the year 

--incarcerated is stored in a flowsheet 
-- the FlowdataID are: 
--    Incarceration Start Date: 'ZZZZZ00071 
--    Incarceration End Date : 'ZZZZZ00072' 


(
@PID varchar(10), 
@YEAR int 
) 

RETURNS int 

--DECLARE @PID varchar(10) 
--DECLARE @YEAR int 
--set @PID = 'ZZZZZ000L6' 
--set @YEAR =2012 

AS 
BEGIN 
declare @R int 


SELECT @R = Numdays from (
       ;with startdates as 
       (
       SELECT 
       dbo.View_PatientFlowValue.FlowValue_Value as val, 
       ROW_NUMBER() OVER(ORDER BY dbo.View_PatientFlowValue.FlowValue_Value) AS RowNumber 
       FROM dbo.View_PatientFlowValue 
       WHERE dbo.View_PatientFlowValue.FlowData_ID = 'ZZZZZ00071' 
       AND dbo.View_PatientFlowValue.FlowValue_RecordState<>1 
       AND Patient_ID = @PID 

       ) 
       ,enddates as 
       (
       SELECT 
       dbo.View_PatientFlowValue.FlowValue_Value val, 
       ROW_NUMBER() OVER(ORDER BY dbo.View_PatientFlowValue.FlowValue_Value) AS RowNumber 
       FROM dbo.View_PatientFlowValue 
       WHERE dbo.View_PatientFlowValue.FlowData_ID = 'ZZZZZ00072' 
       AND dbo.View_PatientFlowValue.FlowValue_RecordState<>1 
       AND Person_ID = @PID 

       ) 

       Select sum(DATEDIFF(d,CalcStart, CalcEnd)) as NumDays 

       from (
         select 
          case 
           when DATEDIFF(d, cast(str(@YEAR*10000+1*100+1) as date), s.val) < 1 then '1/1/' + str(@YEAR) 
           else s.val 
          end As CalcStart, 
          ISNULL(e.Val, cast(str((@YEAR+1)*10000+1*100+1) as date)) as CalcEnd, 
         s.val as realstart, e.val as realend 
         FROM StartDates s 
         LEFT OUTER JOIN EndDates e ON s.RowNumber = e.RowNumber 
        ) accountforyear 

     ) 

return @R 
END 
GO 

Он заявляет, есть неправильный синтаксис около «;» , но если я возьму ";" out, это говорит мне, что есть некорректный синтаксис рядом с ключевым словом «с». Какой здесь синтаксис?

Этот запрос работает отлично автономно.

ответ

2

Вы должны поместить with заявление перед select:

 with startdates as 
     (
     SELECT 
     dbo.View_PatientFlowValue.FlowValue_Value as val, 
     ROW_NUMBER() OVER(ORDER BY dbo.View_PatientFlowValue.FlowValue_Value) AS RowNumber 
     FROM dbo.View_PatientFlowValue 
     WHERE dbo.View_PatientFlowValue.FlowData_ID = 'ZZZZZ00071' 
     AND dbo.View_PatientFlowValue.FlowValue_RecordState<>1 
     AND Patient_ID = @PID 

     ) 
     ,enddates as 
     (
     SELECT 
     dbo.View_PatientFlowValue.FlowValue_Value val, 
     ROW_NUMBER() OVER(ORDER BY dbo.View_PatientFlowValue.FlowValue_Value) AS RowNumber 
     FROM dbo.View_PatientFlowValue 
     WHERE dbo.View_PatientFlowValue.FlowData_ID = 'ZZZZZ00072' 
     AND dbo.View_PatientFlowValue.FlowValue_RecordState<>1 
     AND Person_ID = @PID 

     ) 

     Select @R = sum(DATEDIFF(d,CalcStart, CalcEnd)) as NumDays 

     from (
       select 
        case 
         when DATEDIFF(d, cast(str(@YEAR*10000+1*100+1) as date), s.val) < 1 then '1/1/' + str(@YEAR) 
         else s.val 
        end As CalcStart, 
        ISNULL(e.Val, cast(str((@YEAR+1)*10000+1*100+1) as date)) as CalcEnd, 
       s.val as realstart, e.val as realend 
       FROM StartDates s 
       LEFT OUTER JOIN EndDates e ON s.RowNumber = e.RowNumber 
      ) accountforyear; 

Итак, @R = идет в selectпослеwith. Здесь вам не нужен подзапрос, поэтому я просто добавил назначение в.

3

Я никогда не видел CTE в качестве подзапроса.

Try переписывание, как

; 
with startdates as 
(
    ... copy everything 

) 
Select @R = sum(DATEDIFF(d,CalcStart, CalcEnd)) 
FROM ... 

return @R 
0

Определите КТР перед запросом:

;with CTE_A(ColA, ColB) 
as 
(
    select 
     ColA 
     , ColB 
    from 
     SomeTable 
) 
,CTE_B(ColA, ColC) 
as 
(
    select 
     ColA 
     , ColC 
    from 
     SomeTable2 
) 


select 
    * 
from 
    CTE_A a 
    inner join CTE_B b 
    on a.ColA = b.ColB 
Смежные вопросы