sql >> Databáze >  >> RDS >> Sqlserver

Tipy pro používání SQL Serveru se Salesforce SOQL

Obsah

  1. Přehled
  2. Jednoduché výběrové dotazy na serveru SQL Server nefungují
  3. Hromadné vkládání dat pomocí ovladače SOQL
  4. Aktualizace a odstranění hromadného dotazu
  5. Podpora transakcí Easysoft
  6. Ověření líného schématu
  7. 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:

  1. OPENQUERY , kterou lze použít ve spojení s lokálními tabulkami ke spojení vzdálených a lokálních dat.
  2. 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


  1. Jak funguje AT TIME ZONE v PostgreSQL

  2. Fulltextové vyhledávání s InnoDB

  3. Co je nového v PostgreSQL 12

  4. Oracle RAC a sekvence