【问题标题】:SQL Server to SalesForce Linked Server NightmareSQL Server 到 SalesForce 链接服务器的噩梦
【发布时间】:2017-02-06 23:38:27
【问题描述】:

我在加入链接服务器时得到不一致的结果。这应该是相对简单的事情......但我花了几个小时才弄清楚这一点。我正在使用 SQL Server 2014 和 CData ODBC 驱动程序加入 SalesForce。我只是尝试执行标准的 CRUD 操作并没有做任何花哨的事情,但似乎一次又一次地过滤这些链接的服务器表时,有时结果不会产生。

我目前的主要问题是我很难将两个链接表连接到两个本地表。如果我从连接结果中删除其中一个链接表,则会生成。但是每当我将两个链接表添加到它产生的连接和空记录集时。

是的,所有相关的标识符都存在,所以这确实是链接服务器的问题。以下是我尝试过的三种变体:

SELECT * FROM Offer_Interest oi
INNER JOIN Offer o ON oi.Offer_ID_SQL = o.Offer_ID_SQL
INNER JOIN OPENQUERY([TR-SF-PROD], 'SELECT Id, OFFER_ID_SQL__C FROM Offer__c') osf ON o.Offer_ID_SQL =osf.OFFER_ID_SQL__C
INNER JOIN Interest i ON oi.Interest_ID_SQL = i.Interest_ID_SQL
INNER JOIN OPENQUERY([TR-SF-PROD], 'SELECT INTEREST_ID_SQL__C, Id FROM Interest__c') isf ON i.Interest_ID_SQL =isf.Interest_ID_SQL__c
WHERE o.PrimaryContact_ID_SQL = 2803

我也尝试过不使用 OPENQUERY:

SELECT * FROM FROM Offer_Interest oi
INNER JOIN Offer o ON oi.Offer_ID_SQL = o.Offer_ID_SQL
INNER JOIN [TR-SF-PROD].[CDataSalesforce].[Salesforce].[Offer__c] osf ON o.Offer_ID_SQL =osf.OFFER_ID_SQL__C
INNER JOIN Interest i ON oi.Interest_ID_SQL = i.Interest_ID_SQL
INNER JOIN [TR-SF-PROD].[CDataSalesforce].[Salesforce].[Interest__c] isf ON i.Interest_ID_SQL =isf.Interest_ID_SQL__c
WHERE o.PrimaryContact_ID_SQL = 2803

最后,我还创建了链接服务器表的同义词。如果我单独运行它们,所有这些工作都使用相同的过滤器或 WHERE CLAUSE,尽管如果我在没有 OPENQUERY 的情况下过滤它们,链接的服务器表似乎有问题。

这是我将服务器链接到 SQL Server 的第一次体验,因此任何对此有经验或可能遇到的问题的人都将不胜感激!

【问题讨论】:

  • 你是说如果你只加入一个链接服务器表,不管它是哪一个,你得到结果,但添加另一个返回0结果?当您删除 where 子句时,这是真的吗?
  • @scsimon 是的,如果我删除其中一个链接表(一个或另一个可互换),则不会产生任何结果。带或不带过滤器。
  • 在加入链接服务器表时不会产生任何结果...你确定应该有基于加入条件的结果。即您确定没有排序规则问题,和/或该条件的数据实际存在吗?
  • @scsimon 实际上两者之间的联盟是不同的......当我尝试执行 ORDER BY 时,我被提醒了......因此我一直在避免 ORDER BY 的。根据我在下面提供的临时修复,数据是正确的,并且应该会产生结果,因为我的#TempTable 修复会产生正确的结果。您认为 COALITION 的差异会导致这些奇怪的问题吗?
  • 绝对是,这取决于列中的内容。它们似乎都是 ID,所以应该是一些 INT 列,但这绝对可能是原因。将它们带入 TEMP 以检查数据正是我的建议。

标签: sql-server tsql odbc salesforce cdata


【解决方案1】:

不是我希望的答案,因为它应该可以正常工作。但是我想出的一个临时修复是将我需要的链接服务器值填充到临时表中,然后加入临时表,这有效......但是当然这会增加整个存储过程的执行时间,所以它绝对不是理想的解决方案。如果有人有更好的想法,请仍然回答!

IF EXISTS(SELECT [NAME] FROM tempdb.sys.tables WHERE [NAME] like '#TempOffer%') BEGIN
   DROP TABLE #TempOffer;
END;
SELECT * INTO #TempOffer FROM OPENQUERY([TR-SF-PROD], 'SELECT Id, OFFER_ID_SQL__C FROM Offer__c')

IF EXISTS(SELECT [NAME] FROM tempdb.sys.tables WHERE [NAME] like '#TempInterest%') BEGIN
   DROP TABLE #TempInterest;
END;
SELECT * INTO #TempInterest FROM OPENQUERY([TR-SF-PROD], 'SELECT INTEREST_ID_SQL__C, Id FROM Interest__c')

SELECT * FROM Offer_Interest oi
INNER JOIN Offer o ON oi.Offer_ID_SQL = o.Offer_ID_SQL
INNER JOIN #TempOffer osf ON o.Offer_ID_SQL =osf.OFFER_ID_SQL__C
INNER JOIN Interest i ON oi.Interest_ID_SQL = i.Interest_ID_SQL
INNER JOIN #TempInterest isf ON i.Interest_ID_SQL =isf.Interest_ID_SQL__c
WHERE o.PrimaryContact_ID_SQL = 2803

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2015-10-29
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多