Съдържание
- Общ преглед
- Заявките за обикновен избор в SQL Server не работят
- Групово вмъкване на данни с помощта на SOQL драйвер
- Актуализиране и изтриване на групирането на заявки
- Транзакционна поддръжка на Easysoft
- Ленива проверка на схема
- Ограничения на доставчика на OLEDB за ODBC на Microsoft
Общ преглед
Този документ дава някои съвети за използване на SQL Server със Salesforce. Компонентите, използвани за свързване на SQL Server към Salesforce, са свързан сървър към SQL Server и Easysoft Salesforce ODBC драйвер. Как свързвате SQL Server към Salesforce е описано в тази статия. За примерите в този документ използваното име на свързания сървър (което препращате във вашите SQL команди) е SFSOQL8.
Целият SQL в този документ е тестван срещу SQL Server 2017 и Easysoft Salesforce ODBC драйвер версия 2.0.0.
Ако искате да допринесете за този документ, моля, изпратете изпратеното си по имейл до .
Заявките за обикновен избор в SQL Server не работят
Да приемем, че се опитвате да изпълните тази заявка в SQL Server:
SELECT Id FROM SFSOQL8...Account
SQL Server преобразува този SQL в:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Тъй като езикът Salesforce SOQL не поддържа преименуването на таблици и колони по този начин, в крайна сметка получавате тази грешка:
OLE DB provider "MSDASQL" for linked server "SFSOQL8" returned message "[Easysoft][Salesforce SOQL ODBC Driver]General error: Query Failed: 'MALFORMED_QUERY: only aggregate expressions use field aliasing'".
Msg 7320, Level 16, State 2, Line 1
Cannot execute the query "SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"" against OLE DB provider "MSDASQL" for linked server "SFSOQL8".
SQL Server има два налични метода за изпращане на SOQL към драйвера на Easysoft:
OPENQUERY
, който може да се използва във връзка с локални таблици за свързване на отдалечени и локални данни.EXEC
който може да се използва заедно с параметри за директно изпълнение на вашия SOQL срещу Salesforce.
За да демонстрираме тези методи, ще започнем с присъединяване към SOQL таблица:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
В SQL Server можете да изпълните някоя от следните заявки:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
—Или—
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Почти няма разлика в производителността, тъй като SOQL, който сте написали, се предава направо на сървъра на Salesforce.
По същия начин всички SOQL функции също са достъпни, като се използват същите методи:
SELECT * FROM OPENQUERY(SFSOQL8, 'select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), ''mi'') from Account where Name like ''Bur%'' ')
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Type, BillingCountry, GROUPING(Type) grpType, GROUPING(BillingCountry) grpCty, COUNT(id) accts FROM Account GROUP BY CUBE(Type, BillingCountry) ORDER BY GROUPING(Type), GROUPING(BillingCountry)')
Ако подадете невалиден SOQL, драйверът на Easysoft SOQL ще върне грешката директно от Salesforce. Например:
SELECT * FROM OPENQUERY(SFSOQL8, 'select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), ''mo'') from Account where Name like ''Bur%'' ')
OLE DB provider "MSDASQL" for linked server "SFSOQL8" returned message "[Easysoft][Salesforce SOQL ODBC Driver]General error: Query Failed: 'INVALID_FIELD: select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775 ^ ERROR at Row:1:Column:27 Invalid distance unit: mo. Valid unit: 'mi', 'km''". Msg 7320, Level 16, State 2, Line 1 Cannot execute the query "select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), 'mo') from Account where Name like 'Bur%' " against OLE DB provider "MSDASQL" for linked server "SFSOQL8".
Повече информация за езика SOQL можете да намерите тук.
Групово вмъкване на данни с помощта на SOQL драйвер
В рамките на Salesforce SOAP API има функция, която ви позволява да вмъквате до 200 реда данни от едно извикване на SOAP API. Драйверът на Easysoft Salesforce SOQL ODBC използва тази функция и ви позволява да използвате SQL Server TSQL за групово зареждане на до 200 реда наведнъж.
В моя пример ще добавя нови записи към обекта Account в Salesforce. Това е много основен пример само с няколко колони с данни, но се надявам, че това обяснява как са възможни групови вмъквания от SQL Server. В SQL Server имам локална таблица, наречена Account, която изглежда така:
begin declare @BlockCount as int declare @IsPosted as int declare @PrmName As nvarchar(255) declare @PrmAddress As nvarchar(255) declare @PrmTown As nvarchar(40) declare @PrmPostCode As nvarchar(30) declare @PrmDescription As nvarchar(255) declare @SQL as nvarchar(255) set @BlockCount=0 set @SQL='insert into Account (Name, BillingStreet, BillingCity, BillingPostalCode, Description ) values ( ?, ?, ?, ?, ? )' declare select_cursor cursor local FORWARD_ONLY for select AccName, "Property Description", "Address", Town, PostCode from Account Order by Id open select_cursor fetch next from select_cursor into @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription while @@FETCH_STATUS=0 begin if (@BlockCount=0) Begin set @IsPosted=0 exec('Begin Trans') at SFSOQL8 end set @BlockCount=@BlockCount+1 exec (@SQL, @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription) at SFSOQL8 if (@BlockCount=200) Begin set @IsPosted=1 exec('Commit') at SFSOQL8 end fetch next from select_cursor into @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription end if (@IsPosted=0) begin exec('Commit') at SFSOQL8 end close select_cursor; deallocate select_cursor; end
Този TSQL работи, като чете моята локална таблица Account в курсор.
В началото на първия блок от 200 реда, Begin Trans
се извиква, което казва на драйвера на Easysoft, че всички данни, предадени към него, ще бъдат задържани до Commit
или Rollback
се нарича.
EXEC
функцията изпраща всеки ред, намерен в курсора, към драйвера на Easysoft. След това драйверът създава необходимото извикване на SOAP API. Когато 200 реда са изпратени до Easysoft, изпращам Commit
, което кара драйвера да изпрати извикването на SOAP API към Salesforce.
Когато се достигне края на курсора, ако има записи, изпратени до драйвера на Easysoft, които не са предадени на Salesforce, изпращам окончателен Commit
. След това курсорът се затваря и освобождава.
Ограничението от 200 реда е вътрешно ограничение в Salesforce. Ако се опитате да изпратите повече от 200 реда, ще получите грешка в Salesforce. Драйверът на Easysoft няма вградени ограничения, така че ако Salesforce увеличи ограничението от 200 реда в бъдещи версии на SOAP API, драйверът на Easysoft автоматично ще работи с новото ограничение.
Когато използвате този метод за групово вмъкване, няма ограничение за броя на таблиците, в които можете да вмъквате данни в един блок, така че следният TSQL ще работи:
Begin exec('Begin Trans') at SFSOQL8 exec('Insert into Account ( Name ) values (''Richard Test'') ') at SFSOQL8 exec('Insert into Opportunity ( Name, StageName, CloseDate ) values (''Richard Test'', ''My Stage'', ''2018-08-14T10:07:00Z'') ') at SFSOQL8 exec('Commit') at SFSOQL8 End
Когато използвате метода Begin Trans/Commit за вмъквания, можете да изпращате само изрази за вмъкване. Не можете да смесвате и съпоставяте вмъквания и актуализации, тъй като това не се поддържа в Salesforce SOAP API.
Актуализиране и изтриване на групови заявки
Нашият SOQL драйвер има вграден метод за групови транзакции с данни, когато се използва със заявка UPDATE или DELETE.
Този пример показва как актуализирам персонализирана колона до зададена стойност.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
Salesforce не поддържа UPDATE или DELETE, използвайки SOQL, така че драйверът на Easysoft трябва да преобразува заявката в SOQL SELECT. След това редовете, върнати от SELECT, се обединяват в блокове до 200 и се изпращат блок по блок за АКТУАЛИЗИРАНЕ или ИЗТРИВАНЕ.
Поддръжка за транзакции на Easysoft
Драйверът на Easysoft Salesforce SOQL ODBC поддържа само едно ниво на транзакция. Така че Begin Trans
последвано от някои INSERT могат да бъдат изпратени до Salesforce с COMMIT
или изхвърлен в драйвера с помощта на ROLLBACK
.
Лезиво валидиране на схема
В свойствата на свързания сървър на SQL Server в секцията „Опции на сървъра“ има опция за „Проверка на мързелива схема“. По подразбиране това е зададено на FALSE, което кара SQL Server, когато изпълнява оператор SELECT, да изпрати израза два пъти. При първото изпращане SQL Server използва данните, предадени обратно, за да изгради метаданните за вашия набор от резултати. След това заявката се изпраща отново. Това е доста скъпо режийно, така че Easysoft би препоръчал да зададете "Lazy Schema Validation" на TRUE, което означава, че се изпраща само един SELECT, който получава както метаданните, така и данните. Това също така намалява броя на извършените извиквания на Salesforce API.
Ограничения на OLEDB на Microsoft за доставчик на ODBC
Подробности за ограниченията на OLEDB за доставчик на ODBC можете да намерите тук:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx