1

我有以下程序:

CREATE PROCEDURE [dbo].[meals] @EncounterID nvarchar(15), @EventDate nvarchar(30)
AS
   DECLARE @TSQL varchar(8000);

   SELECT  @TSQL = 'SELECT * FROM OPENQUERY(cerner, ''select ce.result_val  PercentEaten,
ce.event_cd Meal
 from clinical_event ce
 where
 ce.task_assay_cd in ( 5362408, 5362296, 5361870)
 and ce.event_end_dt_tm >= sysdate-30
 and ce.event_cd in (636033, 636036, 636039)
 and ce.event_class_cd = 233
and ce.encntr_id = ''' +CAST(@EncounterID as varchar(15))+ '''
and ce.event_end_dt_tm between to_char('''+CAST(@EventDate as varchar(30))+''' - .5) and 
    to_char('''+CAST(@EventDate as varchar(30))+''' - 1)
'')';
EXEC (@TSQL);
GO

当我使用这一行执行时:

exec dbo.meals @EncounterID =  '12345678',@EventDate = '07/18/2013'

我收到一个错误,只是说error at line 9

我究竟做错了什么??

4

1 回答 1

0

从评论中我可以得出以下结论:

  1. 检查你是否真的有 to_char() 功能cerner。如果你没有它,那就是错误的全部。
  2. 相反CAST(@EventDate as varchar(30)),请尝试将其转换为CONVERT(varchar(30), @EventDate, 111)(如果您还需要时间,请将111更改为120

编辑

显然你必须在 openquery 中使用 Oracle 语法。它应该是这样的......

AND ce.event_end_dt_tm between to_date ('2013/01/01', 'yyyy/mm/dd') and to_date ('2013/12/31', 'yyyy/mm/dd')

因此,第 2 点应该是您的解决方案,使用稍微不同的 Oracle 函数调用。

完整的 AND 子句:

...
and ce.event_end_dt_tm between to_date(''' + CONVERT(varchar(30), @EventDate, 111) + ''', ''yyyy/mm/dd'') - 1 and to_date(''' + CONVERT(varchar(30), @EventDate, 111) + ''', ''yyyy/mm/dd'') - 0.5

注意:我不明白这些日期有什么意义,所以我颠倒了fromto日期的顺序。

于 2013-07-23T12:31:38.913 回答