Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wskazówki dotyczące korzystania z SQL Server z Salesforce SOQL

Spis treści

  1. Przegląd
  2. Proste zapytania Select w SQL Server nie działają
  3. Zbiorcze wstawianie danych za pomocą sterownika SOQL
  4. Aktualizuj i usuwaj zbiorcze zapytania
  5. Wsparcie transakcyjne Easysoft
  6. Weryfikacja leniwego schematu
  7. 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:

  1. OPENQUERY , który może być używany w połączeniu z lokalnymi tabelami do łączenia danych zdalnych i lokalnych.
  2. 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zwróć wszystkie grupy plików dla bieżącej bazy danych w SQL Server

  2. Nieużywany indeks programu SQL Server

  3. Pomiń procedurę zapisaną w T-SQL

  4. Statystyka operacji we/wy pliku wydajności programu SQL Server

  5. Jak mogę połączyć się z SQL Server przy użyciu zintegrowanych zabezpieczeń ze sterownikiem JDBC?