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,以便我可以看到它是如何完成的。

谢谢!

4

2 回答 2

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 的最有效方式。

于 2013-07-01T18:44:18.230 回答
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
于 2013-07-01T18:52:14.527 回答