Sommario
- Panoramica
- Le query di selezione semplice in SQL Server non funzionano
- Inserimento in blocco di dati utilizzando il driver SOQL
- Aggiorna ed elimina il bulking delle query
- Supporto transazionale Easysoft
- Convalida dello schema pigro
- Limitazioni del provider OLEDB di Microsoft per ODBC
Panoramica
Questo documento fornisce alcuni suggerimenti sull'utilizzo di SQL Server con Salesforce. I componenti utilizzati per connettere SQL Server a Salesforce sono un SQL Server Linked Server e il driver Easysoft Salesforce ODBC. In questo articolo viene descritta la modalità di connessione di SQL Server a Salesforce. Per gli esempi in questo documento, il nome del server collegato (a cui fai riferimento nei comandi SQL) utilizzato è SFSOQL8.
Tutto l'SQL in questo documento è stato testato rispetto a SQL Server 2017 e al driver Easysoft Salesforce ODBC versione 2.0.0.
Se desideri contribuire a questo documento, invia la tua richiesta via email a .
Le query di selezione semplice in SQL Server non funzionano
Supponiamo che tu stia tentando di eseguire questa query in SQL Server:
SELECT Id FROM SFSOQL8...Account
SQL Server converte quell'SQL in:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Poiché il linguaggio SOQL di Salesforce non supporta la ridenominazione di tabelle e colonne in questo modo, si ottiene questo errore:
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 ha due metodi disponibili per inviare SOQL al driver Easysoft:
OPENQUERY
, che può essere utilizzato insieme alle tabelle locali per unire dati remoti e locali.EXEC
che può essere utilizzato insieme ai parametri per eseguire direttamente il tuo SOQL su Salesforce.
Per dimostrare questi metodi, inizieremo con un join di una tabella SOQL:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
In SQL Server è possibile eseguire una delle seguenti query:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
—Oppure—
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Non c'è quasi nessuna differenza nelle prestazioni poiché il SOQL che hai scritto viene passato direttamente al server Salesforce.
Allo stesso modo, anche tutte le funzioni SOQL sono disponibili utilizzando gli stessi metodi:
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)')
Se si passa SOQL non valido, il driver SOQL Easysoft restituirà l'errore direttamente da Salesforce. Ad esempio:
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".
Maggiori informazioni sul linguaggio SOQL possono essere trovate qui.
Inserimento in blocco di dati utilizzando il driver SOQL
All'interno dell'API SOAP di Salesforce è presente una funzione che consente di inserire fino a 200 righe di dati da una singola chiamata API SOAP. Il driver Easysoft Salesforce SOQL ODBC utilizza questa funzione e consente di utilizzare SQL Server TSQL per caricare in blocco fino a 200 righe alla volta.
Nel mio esempio, aggiungerò nuovi record all'oggetto Account in Salesforce. Questo è un esempio molto semplice con solo poche colonne di dati, ma spero che questo spieghi come sono possibili gli inserimenti in blocco da SQL Server. In SQL Server, ho una tabella locale chiamata Account che assomiglia a:
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
Questo TSQL funziona leggendo la mia tabella Account locale in un cursore.
All'inizio del primo blocco di 200 righe, Begin Trans
viene chiamato, che dice al driver Easysoft che tutti i dati passati ad esso verranno conservati fino a quando un Commit
o un Rollback
viene chiamato.
Il EXEC
La funzione invia ogni riga trovata nel cursore al driver Easysoft. Il driver crea quindi la chiamata API SOAP richiesta. Quando 200 righe sono state inviate a Easysoft, invio un Commit
, che fa sì che il driver invii la chiamata API SOAP a Salesforce.
Quando si raggiunge la fine del cursore, se ci sono dei record inviati al driver Easysoft che non sono stati passati a Salesforce, invio un Commit
finale . Il cursore viene quindi chiuso e deallocato.
Il limite di 200 righe è un limite interno in Salesforce. Se provi a inviare più di 200 righe, riceverai un errore Salesforce. Il driver Easysoft non ha limiti incorporati, quindi se Salesforce aumenta il limite di 200 righe nelle versioni future dell'API SOAP, il driver Easysoft funzionerà automaticamente con il nuovo limite.
Quando si utilizza questo metodo di inserimento in blocco, non c'è limite al numero di tabelle in cui è possibile inserire dati in un singolo blocco, quindi il seguente TSQL funzionerà:
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
Quando si utilizza il metodo Begin Trans/Commit per gli inserimenti, è possibile inviare solo istruzioni di inserimento. Non è possibile combinare e abbinare inserti e aggiornamenti poiché ciò non è supportato nell'API SOAP di Salesforce.
Aggiorna ed elimina il bulking delle query
Il nostro driver SOQL ha un metodo integrato per il bulking delle transazioni di dati, se utilizzato con una query UPDATE o DELETE.
Questo esempio mostra come aggiorno una colonna personalizzata su un valore impostato.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
Salesforce non supporta UPDATE o DELETE utilizzando SOQL, quindi il driver Easysoft deve convertire la query in un SOQL SELECT. Le righe restituite da SELECT vengono quindi raggruppate in blocchi fino a 200 e inviate un blocco alla volta per un UPDATE o DELETE.
Supporto transazionale Easysoft
Il driver ODBC Easysoft Salesforce SOQL supporta un solo livello di transazione. Quindi un Begin Trans
seguiti da alcuni INSERT possono essere inviati a Salesforce con un COMMIT
o gettato via all'interno del driver utilizzando un ROLLBACK
.
Convalida schema pigro
Nelle proprietà del server collegato di SQL Server nella sezione "Opzioni server" è presente un'opzione per "Lazy Schema Validation". Per impostazione predefinita, questo è impostato su FALSE che fa sì che SQL Server durante l'esecuzione di un'istruzione SELECT invii l'istruzione due volte. La prima volta che viene inviato, SQL Server utilizza i dettagli restituiti per creare i metadati sul set di risultati. Quindi la query viene inviata di nuovo. Questo è un sovraccarico piuttosto costoso, quindi Easysoft consiglia di impostare "Lazy Schema Validation" su TRUE, il che significa che viene inviato solo un SELECT, che ottiene sia i metadati che i dati. Ciò riduce anche il numero di chiamate API Salesforce effettuate.
Limitazioni del provider OLEDB di Microsoft per ODBC
I dettagli sulle limitazioni del provider OLEDB per ODBC sono disponibili qui:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx