2013-07-23 37 views
1

OPENQUERY存儲過程,我有以下步驟:Exec用帶參數

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

的錯誤是什麼我做錯了嗎?

+1

你的openquery包裝應該沒問題(除了縮進它)。問題出在你的包裝查詢中('select ce.result_val PercentEaten ...'),我敢打賭它在某處引用了.... – OzrenTkalcecKrznaric

+0

我試着在兩個變量上附加引號,錯誤移動到日期變量 – user1879417

+0

你可以發佈實際和完整的錯誤信息? –

回答

0

從我可以斷定以下的評論:

  1. 檢查,如果你真的對cerner側TO_CHAR()函數。如果你沒有,那就是錯誤。
  2. 相反CAST(@EventDate as varchar(30)),嘗試將其轉換像CONVERT(varchar(30), @EventDate, 111)(如果你需要的時間,以及,改變到)

編輯

顯然你已經使用Oracle語法OPENQUERY。它應該是這樣的...

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 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 

注意:我不明白這些日期如何作任何意義,所以我倒的順序從日期。

+0

我不能使用CONVERT,因爲Cerner數據庫是Oracle。我必須發送Oracle語法,對吧?編輯 - 我明白你的意思了。我會嘗試。 – user1879417

+0

好吧,我試着刪除TO_CHAR,得到了完全相同的錯誤。我嘗試了CONVERT,得到了完全相同的錯誤。 – user1879417

+0

此部分'CONVERT(varchar(30),@ EventDate,111)'在SQL Server端執行,而不是Oracle – OzrenTkalcecKrznaric