sql >> Database teknologi >  >> RDS >> Sqlserver

Tips til brug af SQL Server med Salesforce SOQL

Indholdsfortegnelse

  1. Oversigt
  2. Simple Select-forespørgsler i SQL Server virker ikke
  3. Masseindsættelse af data ved hjælp af SOQL-driveren
  4. Opdater og slet forespørgselsmasse
  5. Easysoft Transactional Support
  6. Dovne skemavalidering
  7. 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:

  1. OPENQUERY , som kan bruges sammen med lokale tabeller til at forbinde eksterne og lokale data.
  2. 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


  1. Oracle indsæt fra vælg i tabel med flere kolonner

  2. SQL-forespørgsel til at opdele kolonnedata i rækker

  3. Returnerer string array og brug det på AutoCompleteTextview

  4. Tilslutning af en Bastion Server til en PostgreSQL Server via SSH Tunnel