2013-07-01 32 views
5
SELECT * INTO #C_INFO FROM OPENQUERY(ORACLE_CMIDW1,' SELECT A.CID, A.ANO, 
A.COMP_REVD_DATE, A.REVIEW_COMP_DATE, A.ISSUE, B.ENT_ID, A.TYPE_ID FROM XXX 
B INNER JOIN YYY A ON B.ANO = A.ANO WHERE A.REVIEW_COMP_DATE Between 
''2012-03-01'' And ''2013-10-31'' AND Not A.ISSUE = 110 AND A.TYPE_ID = 1 
and B.ENT_ID In (2,3) ') 

上面的SQL工作完美,但我不想硬編碼的日期。這就是試圖使用變量的原因。日期格式(yyyy-mm-dd, '2013-03-01'),除此日期格式外,Oracle不執行sql。SQL鏈接服務器,使用變量打開查詢

是否有可能這樣做,如果是這樣的話,請重新編寫整個sql使用變量,以便我可以看到它是如何完成的。

謝謝!

+0

你得到你能告訴我們一個錯誤? –

+0

我沒有任何錯誤,我想用變量替換那些硬編碼的日期。如果我能做到的話,把我的查詢發給我,以便我能看到它是如何完成的。 – user1810575

+0

非常相關;可能重複:http://stackoverflow.com/questions/3378496 – NateJ

回答

8

下面的代碼應該做的伎倆。您無法將變量傳遞給OPENQUERY。但是,您可以動態生成將通過OPENQUERY執行的代碼。

DECLARE @StartDate DATETIME = '2012-03-01'; 
DECLARE @EndDate DATETIME = '2013-10-31'; 

DECLARE @SqlCommand NVARCHAR(MAX) = N'SELECT * 
INTO #C_INFO 
FROM OPENQUERY(ORACLE_CMIDW1, 
    ''SELECT A.CID, A.ANO, A.COMP_REVD_DATE, A.REVIEW_COMP_DATE, A.ISSUE, B.ENT_ID, A.TYPE_ID 
    FROM XXX B 
    INNER JOIN YYY A 
     ON B.ANO = A.ANO 
    WHERE A.REVIEW_COMP_DATE BETWEEN ''''' + CONVERT(CHAR(10), @StartDate, 120) + ''''' AND ''''' + CONVERT(CHAR(10), @EndDate, 120) + ''''' 
    AND Not A.ISSUE = 110 AND A.TYPE_ID = 1 and B.ENT_ID In (2,3)'');'; 

PRINT @SqlCommand 

EXEC sp_ExecuteSQL @SqlCommand; 

在單獨的說明中,我建議您考慮用加載數據的SSIS包替換鏈接的服務器查詢。儘管上面的代碼有效,但這不是將數據從Oracle服務器傳輸到SQL Server的最有效方式。

+0

由MS自己的知識庫文章支持:https://support.microsoft.com/en-us/kb/314520 – NateJ

0

這應做到:

DECLARE @startDate DATETIME = '2013-06-01' 
DECLARE @endDate DATETIME = '2013-07-01' 

INSERT INTO #C_INFO 
EXECUTE('SELECT A.CID, A.ANO, 
A.COMP_REVD_DATE, A.REVIEW_COMP_DATE, A.ISSUE, B.ENT_ID, A.TYPE_ID FROM XXX 
B INNER JOIN YYY A ON B.ANO = A.ANO WHERE A.REVIEW_COMP_DATE Between ? And ? 
AND Not A.ISSUE = 110 AND A.TYPE_ID = 1 AND B.ENT_ID In (2,3) ', @startDate , @endDate) AT ORACLE_CMIDW1