【问题标题】:Exec stored procedure with OPENQUERY with parameters使用带有参数的 OPENQUERY 执行存储过程
【发布时间】:2013-07-23 11:11:34
【问题描述】:

我有以下程序:

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

我做错了什么??

【问题讨论】:

  • 你的 openquery 包装器应该没问题(除了缩进它)。问题出在您的包装查询 (select ce.result_val PercentEaten...) 中,我敢打赌它在引号中......
  • 我尝试了两个变量的附加引号,错误移至日期变量
  • 你能贴出实际完整的错误信息吗?
  • 尝试删除and ce.event_end_dt_tm between ... 子句并运行诊断它。在测试的时候,如果结果太多,也许你应该考虑添加 TOP 1。
  • 它可以在没有子句的情况下使用,但日期很重要。是否可以使用多个参数?

标签: sql-server stored-procedures openquery


【解决方案1】:

从 cmets 我可以得出以下结论:

  1. 检查cerner 端是否真的有to_char() 函数。如果你没有它,那就是错误的全部。
  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 日期的顺序。

【讨论】:

  • 我不能使用 CONVERT,因为 Cerner 数据库是 Oracle。我必须发送 Oracle 语法,对吗?编辑 - 我明白你现在的意思了。我会试试的。
  • 好的,我尝试删除 TO_CHAR,得到了完全相同的错误。我尝试了 CONVERT,得到了完全相同的错误。
  • 这部分 CONVERT(varchar(30), @EventDate, 111) 在 SQL Server 端执行,而不是 Oracle
  • 错误信息还是一样。是否可以在初始选择语句中使用 EventDate 参数?
  • 我并没有真正得到 initial 查询的问题;但是,您可以尝试一件事吗...and ce.event_end_dt_tm between to_date(''2013-07-01'', ''yyyy/mm/dd'') - 1 and to_date(''2013-07-01'', ''yyyy/mm/dd'') - 0.5
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 2015-09-21
  • 1970-01-01
  • 2023-04-07
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多