Spis treści
- Przegląd
- Proste zapytania Select w SQL Server nie działają
- Zbiorcze wstawianie danych za pomocą sterownika SOQL
- Aktualizuj i usuwaj zbiorcze zapytania
- Wsparcie transakcyjne Easysoft
- Weryfikacja leniwego schematu
- Ograniczenia dostawcy OLEDB firmy Microsoft dla ODBC
Przegląd
Ten dokument zawiera wskazówki dotyczące używania SQL Server z Salesforce. Komponenty używane do łączenia SQL Server z Salesforce to SQL Server Linked Server i sterownik Easysoft Salesforce ODBC. W tym artykule opisano sposób łączenia programu SQL Server z Salesforce. W przykładach w tym dokumencie użyta nazwa serwera połączonego (do której odwołujesz się w poleceniach SQL) to SFSOQL8.
Cały kod SQL w tym dokumencie został przetestowany pod kątem SQL Server 2017 i sterownika Easysoft Salesforce ODBC w wersji 2.0.0.
Jeśli chcesz przyczynić się do powstania tego dokumentu, wyślij swoje zgłoszenie pocztą elektroniczną na adres .
Proste zapytania Select w SQL Server nie działają
Załóżmy, że próbujesz uruchomić to zapytanie w SQL Server:
SELECT Id FROM SFSOQL8...Account
SQL Server konwertuje ten kod SQL na:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Ponieważ język Salesforce SOQL nie obsługuje zmiany nazw tabel i kolumn w ten sposób, pojawia się następujący błąd:
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 udostępnia dwie metody wysyłania SOQL do sterownika Easysoft:
OPENQUERY
, który może być używany w połączeniu z lokalnymi tabelami do łączenia danych zdalnych i lokalnych.EXEC
które mogą być używane wraz z parametrami do bezpośredniego uruchomienia SOQL w Salesforce.
Aby zademonstrować te metody, zaczniemy od złączenia tabeli SOQL:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
W SQL Server możesz uruchomić jedno z następujących zapytań:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
—Lub—
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Nie ma prawie żadnej różnicy w wydajności, ponieważ napisany przez Ciebie SOQL jest przekazywany bezpośrednio na serwer Salesforce.
Podobnie wszystkie funkcje SOQL są również dostępne przy użyciu tych samych metod:
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)')
Jeśli przekażesz nieprawidłowy SOQL, sterownik Easysoft SOQL zwróci błąd bezpośrednio z Salesforce. Na przykład:
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".
Więcej informacji na temat języka SOQL można znaleźć tutaj.
Zbiorcze wstawianie danych za pomocą sterownika SOQL
W ramach Salesforce SOAP API znajduje się funkcja, która pozwala wstawić do 200 wierszy danych z jednego wywołania SOAP API. Sterownik Easysoft Salesforce SOQL ODBC wykorzystuje tę funkcję i pozwala używać SQL Server TSQL do zbiorczego ładowania do 200 wierszy na raz.
W moim przykładzie zamierzam dodać nowe rekordy do obiektu Konto w Salesforce. Jest to bardzo prosty przykład z kilkoma kolumnami danych, ale mam nadzieję, że wyjaśnia to, w jaki sposób możliwe jest wstawianie zbiorcze z SQL Server. W SQL Server mam lokalną tabelę o nazwie Konto, która wygląda tak:
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
Ten TSQL działa poprzez odczytywanie mojej lokalnej tabeli kont do kursora.
Na początku pierwszego bloku 200 wierszy Begin Trans
jest wywoływana, co mówi sterownikowi Easysoft, że wszelkie przekazane do niego dane będą przechowywane do momentu, gdy Commit
lub Rollback
nazywa się.
EXEC
funkcja wysyła każdy wiersz znaleziony w kursorze do sterownika Easysoft. Następnie sterownik tworzy wymagane wywołanie SOAP API. Po wysłaniu 200 wierszy do Easysoft wysyłam Commit
, co powoduje, że sterownik wysyła wywołanie SOAP API do Salesforce.
Po osiągnięciu końca kursora, jeśli są jakieś rekordy wysłane do sterownika Easysoft, które nie zostały przekazane do Salesforce, wysyłam końcowe Commit
. Kursor jest następnie zamykany i zwalniany.
Limit 200 wierszy to wewnętrzny limit w Salesforce. Jeśli spróbujesz wysłać więcej niż 200 wierszy, otrzymasz błąd Salesforce. Sterownik Easysoft nie ma wbudowanych limitów, więc jeśli Salesforce zwiększy limit 200 wierszy w przyszłych wersjach SOAP API, sterownik Easysoft będzie automatycznie działał z nowym limitem.
Podczas korzystania z tej metody zbiorczego wstawiania nie ma ograniczeń co do liczby tabel, do których można wstawić dane w jednym bloku, więc następujący TSQL będzie działał:
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
Korzystając z metody Begin Trans/Commit dla wstawek, można wysyłać tylko instrukcje wstawiania. Nie możesz mieszać i dopasowywać wstawek i aktualizacji, ponieważ nie jest to obsługiwane w Salesforce SOAP API.
Aktualizuj i usuwaj zbiorcze zapytania
Nasz sterownik SOQL ma wbudowaną metodę łączenia transakcji danych, gdy jest używany z zapytaniem UPDATE lub DELETE.
Ten przykład pokazuje, jak zaktualizować niestandardową kolumnę do ustawionej wartości.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
Salesforce nie obsługuje UPDATE ani DELETE przy użyciu SOQL, więc sterownik Easysoft musi przekonwertować zapytanie na SOQL SELECT. Wiersze zwrócone przez SELECT są następnie grupowane w bloki po 200 sztuk i wysyłane po jednym bloku w celu UPDATE lub DELETE.
Wsparcie transakcyjne Easysoft
Sterownik Easysoft Salesforce SOQL ODBC obsługuje tylko jeden poziom transakcji. Więc Begin Trans
a następnie kilka WSTAWEK można wysłać do Salesforce z COMMIT
lub wyrzucone w sterowniku za pomocą ROLLBACK
.
Weryfikacja leniwego schematu
We właściwościach serwera połączonego programu SQL Server w sekcji „Opcje serwera” znajduje się opcja „Sprawdzanie z opóźnieniem schematu”. Domyślnie jest to ustawione na FALSE, co powoduje, że SQL Server po uruchomieniu instrukcji SELECT wysyła ją dwukrotnie. Przy pierwszym wysłaniu SQL Server wykorzystuje przekazane z powrotem szczegóły do zbudowania metadanych dotyczących zestawu wyników. Następnie zapytanie jest wysyłane ponownie. Jest to dość kosztowne obciążenie, więc Easysoft zaleca ustawienie „Lazy Schema Validation” na TRUE, co oznacza, że wysyłany jest tylko jeden SELECT, który pobiera zarówno metadane, jak i dane. Zmniejsza to również liczbę wykonywanych wywołań interfejsu Salesforce API.
Ograniczenia Microsoft OLEDB dla dostawcy ODBC
Szczegółowe informacje na temat ograniczeń dostawcy OLEDB dla ODBC można znaleźć tutaj:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx