Obsah
- Přehled
- Jednoduché výběrové dotazy na serveru SQL Server nefungují
- Hromadné vkládání dat pomocí ovladače SOQL
- Aktualizace a odstranění hromadného dotazu
- Podpora transakcí Easysoft
- Ověření líného schématu
- Omezení OLEDB společnosti Microsoft pro poskytovatele ODBC
Přehled
Tento dokument poskytuje několik tipů, jak používat SQL Server se Salesforce. Komponenty používané k připojení SQL Server k Salesforce jsou SQL Server Linked Server a Easysoft Salesforce ODBC Driver. Jak připojíte SQL Server k Salesforce, je popsáno v tomto článku. V příkladech v tomto dokumentu je použitý název propojeného serveru (na který odkazujete v příkazech SQL) SFSOQL8.
Všechny SQL v tomto dokumentu byly testovány s SQL Server 2017 a ovladačem Easysoft Salesforce ODBC verze 2.0.0.
Pokud byste chtěli přispět k tomuto dokumentu, zašlete svůj příspěvek e-mailem na adresu .
Jednoduché výběrové dotazy na serveru SQL Server nefungují
Řekněme, že se pokoušíte spustit tento dotaz v SQL Server:
SELECT Id FROM SFSOQL8...Account
SQL Server převede tento SQL na:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Protože jazyk Salesforce SOQL nepodporuje přejmenování tabulek a sloupců tímto způsobem, skončíte s touto chybou:
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 má k dispozici dva způsoby odesílání SOQL do ovladače Easysoft:
OPENQUERY
, kterou lze použít ve spojení s lokálními tabulkami ke spojení vzdálených a lokálních dat.EXEC
které lze použít spolu s parametry k přímému spuštění vašeho SOQL proti Salesforce.
Abychom tyto metody demonstrovali, začneme spojením tabulky SOQL:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
V SQL Server můžete spustit některý z následujících dotazů:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
—Nebo —
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Neexistuje téměř žádný rozdíl ve výkonu, protože vámi napsaný SOQL je předán přímo na server Salesforce.
Stejně tak všechny funkce SOQL jsou také dostupné pomocí stejných 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)')
Pokud předáte neplatný SOQL, ovladač Easysoft SOQL vrátí chybu přímo ze Salesforce. Například:
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".
Více informací o jazyce SOQL naleznete zde.
Hromadné vkládání dat pomocí ovladače SOQL
V rámci Salesforce SOAP API existuje funkce, která umožňuje vložit až 200 řádků dat z jednoho volání SOAP API. Ovladač Easysoft Salesforce SOQL ODBC využívá tuto funkci a umožňuje vám používat SQL Server TSQL k hromadnému načítání až 200 řádků najednou.
V mém příkladu přidám nové záznamy do objektu Account v rámci Salesforce. Toto je velmi základní příklad s pouze několika sloupci dat, ale doufám, že to vysvětluje, jak je možné hromadné vkládání ze serveru SQL Server. V SQL Server mám místní tabulku nazvanou Účet, která vypadá takto:
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
Toto TSQL funguje tak, že načte moji místní tabulku účtů do kurzoru.
Na začátku prvního bloku 200 řádků je Begin Trans
je voláno, což říká ovladači Easysoft, že všechna data, která mu byla předána, budou uchována, dokud nebude Commit
nebo Rollback
se nazývá.
EXEC
funkce odešle každý řádek nalezený v kurzoru do ovladače Easysoft. Ovladač poté vytvoří požadované volání SOAP API. Když bylo Easysoftu odesláno 200 řádků, posílám Commit
, což způsobí, že ovladač odešle volání SOAP API do Salesforce.
Když je dosaženo konce kurzoru, pokud jsou do ovladače Easysoft odeslány nějaké záznamy, které nebyly předány Salesforce, pošlu poslední Commit
. Kurzor je poté uzavřen a uvolněn.
Limit 200 řádků je interní limit v rámci Salesforce. Pokud se pokusíte odeslat více než 200 řádků, zobrazí se chyba Salesforce. Ovladač Easysoft nemá žádné vestavěné limity, takže pokud Salesforce v budoucích verzích SOAP API zvýší limit 200 řádků, bude ovladač Easysoft automaticky pracovat s novým limitem.
Při použití této metody hromadného vkládání neexistuje žádný limit na počet tabulek, do kterých můžete vkládat data do jednoho bloku, takže bude fungovat následující 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
Při použití metody Begin Trans/Commit pro inserty můžete odesílat pouze příkazy insert. Nemůžete kombinovat vložky a aktualizace, protože to není podporováno v Salesforce SOAP API.
Hromadné aktualizace a odstranění dotazů
Náš ovladač SOQL má vestavěnou metodu pro hromadné transakce dat při použití s dotazem UPDATE nebo DELETE.
Tento příklad ukazuje, jak aktualizuji vlastní sloupec na nastavenou hodnotu.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
Salesforce nepodporuje UPDATES nebo DELETE pomocí SOQL, takže ovladač Easysoft musí převést dotaz na SOQL SELECT. Řádky vrácené z SELECT jsou poté sloučeny do bloků až po 200 a odeslány po bloku pro UPDATE nebo DELETE.
transakční podpora Easysoft
Ovladač Easysoft Salesforce SOQL ODBC podporuje pouze jednu úroveň transakce. Takže Begin Trans
následované několika INSERTy lze odeslat do Salesforce pomocí COMMIT
nebo zahozen v ovladači pomocí ROLLBACK
.
Ověření líného schématu
Ve vlastnostech propojeného serveru SQL Server v části "Možnosti serveru" je možnost "Ověření líného schématu". Ve výchozím nastavení je toto nastaveno na FALSE, což způsobí, že SQL Server při spuštění příkazu SELECT odešle příkaz dvakrát. Při prvním odeslání SQL Server použije podrobnosti předané zpět k vytvoření metadat o vaší sadě výsledků. Poté je dotaz odeslán znovu. To je poměrně drahá režie, takže Easysoft doporučuje nastavit "Lazy Schema Validation" na TRUE, což znamená, že je odeslán pouze jeden SELECT, který získá jak metadata, tak data. To také snižuje počet uskutečněných volání rozhraní Salesforce API.
Omezení OLEDB společnosti Microsoft pro poskytovatele ODBC
Podrobnosti o omezeních OLEDB pro poskytovatele ODBC naleznete zde:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx