Indholdsfortegnelse
- Oversigt
- Simple Select-forespørgsler i SQL Server virker ikke
- Masseindsættelse af data ved hjælp af SOQL-driveren
- Opdater og slet forespørgselsmasse
- Easysoft Transactional Support
- Dovne skemavalidering
- Begrænsninger for Microsofts OLEDB for ODBC-udbyder
Oversigt
Dette dokument giver nogle tips om brug af SQL Server med Salesforce. Komponenterne, der bruges til at forbinde SQL Server til Salesforce, er en SQL Server Linked Server og Easysoft Salesforce ODBC Driver. Hvordan du forbinder SQL Server til Salesforce er beskrevet i denne artikel. For eksemplerne i dette dokument er det linkede servernavn (som du henviser til i dine SQL-kommandoer) SFSOQL8.
Al SQL i dette dokument blev testet mod SQL Server 2017 og Easysoft Salesforce ODBC-driveren version 2.0.0.
Hvis du gerne vil bidrage til dette dokument, bedes du sende en e-mail til .
Simple Select-forespørgsler i SQL Server virker ikke
Lad os sige, at du prøver at køre denne forespørgsel i SQL Server:
SELECT Id FROM SFSOQL8...Account
SQL Server konverterer denne SQL til:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Da Salesforce SOQL-sproget ikke understøtter omdøbning af tabeller og kolonner på den måde, ender du med denne fejl:
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 har to tilgængelige metoder til at sende SOQL til Easysoft-driveren:
OPENQUERY
, som kan bruges sammen med lokale tabeller til at forbinde eksterne og lokale data.EXEC
som kan bruges sammen med parametre til direkte at køre din SOQL mod Salesforce.
For at demonstrere disse metoder starter vi med en SOQL tabel join:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
I SQL Server kan du køre en af følgende forespørgsler:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
—Eller—
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Der er næsten ingen forskel i ydeevne, da den SOQL, du har skrevet, sendes direkte til Salesforce-serveren.
Ligeledes er alle SOQL-funktionerne også tilgængelige ved hjælp af de samme metoder:
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)')
Hvis du sender ugyldig SOQL, returnerer Easysoft SOQL-driveren fejlen direkte fra Salesforce. For eksempel:
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".
Mere information om SOQL-sproget kan findes her.
Masseindsættelse af data ved hjælp af SOQL-driveren
Inden for Salesforce SOAP API er der en funktion, der giver dig mulighed for at indsætte op til 200 rækker data fra et enkelt SOAP API-kald. Easysoft Salesforce SOQL ODBC-driveren gør brug af denne funktion og lader dig bruge SQL Server TSQL til at masseindlæse op til 200 rækker ad gangen.
I mit eksempel vil jeg tilføje nye poster til kontoobjektet i Salesforce. Dette er et meget grundlæggende eksempel med kun nogle få kolonner med data, men jeg håber, at dette forklarer, hvordan bulk-indsættelser er mulige fra SQL Server. I SQL Server har jeg en lokal tabel kaldet Konto, som ser sådan ud:
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
Denne TSQL fungerer ved at læse min lokale kontotabel ind i en markør.
Ved starten af den første blok med 200 rækker, Begin Trans
kaldes, hvilket fortæller Easysoft-driveren, at alle data, der sendes til den, vil blive tilbageholdt indtil enten en Commit
eller en Rollback
kaldes.
EXEC
funktionen sender hver række fundet i markøren til Easysoft-driveren. Driveren opbygger derefter det nødvendige SOAP API-kald. Når der er sendt 200 rækker til Easysoft, sender jeg en Commit
, hvilket får driveren til at sende SOAP API-kaldet til Salesforce.
Når slutningen af markøren er nået, hvis der er nogen poster sendt til Easysoft-driveren, som ikke er blevet videregivet til Salesforce, sender jeg en sidste Commit
. Markøren lukkes derefter og deallokeres.
Grænsen på 200 rækker er en intern grænse i Salesforce. Hvis du prøver at sende mere end 200 rækker, får du en Salesforce-fejl. Easysoft-driveren har ingen indbyggede grænser, så hvis Salesforce øger grænsen på 200 rækker i fremtidige versioner af SOAP API, vil Easysoft-driveren automatisk arbejde med den nye grænse.
Når du bruger denne masseindsættelsesmetode, er der ingen grænse for antallet af tabeller, du kan indsætte data til i en enkelt blok, så følgende TSQL vil fungere:
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
Når du bruger Begin Trans/ Commit-metoden til indsættelser, kan du kun sende indsætningsudsagn. Du kan ikke blande og matche inserts og opdateringer, da dette ikke understøttes i Salesforce SOAP API.
Opdater og slet forespørgselsmasse
Vores SOQL-driver har en indbygget metode til bulking af datatransaktioner, når den bruges med en OPDATERING eller en SLET-forespørgsel.
Dette eksempel viser, hvordan jeg opdaterer en tilpasset kolonne til en indstillet værdi.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
Salesforce understøtter ikke OPDATERINGER eller SLETTER ved hjælp af SOQL, så Easysoft-driveren skal konvertere forespørgslen til en SOQL SELECT. De rækker, der returneres fra SELECT, samles derefter i blokke på op til 200 og sendes en blok ad gangen til en OPDATERING eller SLETT.
Easysoft Transactional Support
Easysoft Salesforce SOQL ODBC-driveren understøtter kun et enkelt transaktionsniveau. Så en Begin Trans
efterfulgt af nogle INSERT'er kan sendes til Salesforce med en COMMIT
eller smidt væk i driveren ved at bruge en ROLLBACK
.
Dovne skemavalidering
I din SQL Server-linkede serveregenskaber under "Serverindstillinger" sektionen er en mulighed for "Lazy Schema Validation". Som standard er dette sat til FALSE, hvilket får SQL Server til at sende sætningen to gange, når den kører en SELECT-sætning. Første gang den sendes, bruger SQL Server de detaljer, der er sendt tilbage til at opbygge metadata om dit resultatsæt. Så sendes forespørgslen igen. Dette er en ret dyr overhead, så Easysoft vil anbefale, at du sætter "Lazy Schema Validation" til TRUE, hvilket betyder, at der kun sendes én SELECT, som både henter metadata og data. Dette reducerer også antallet af Salesforce API-kald, der foretages.
Begrænsninger for Microsofts OLEDB for ODBC-udbyder
Detaljer om begrænsningerne af OLEDB for ODBC-udbyderen kan findes her:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx