sql >> Database >  >> RDS >> Sqlserver

Tips voor het gebruik van SQL Server met Salesforce SOQL

Inhoudsopgave

  1. Overzicht
  2. Eenvoudige selectiequery's in SQL Server werken niet
  3. Gegevens in bulk invoegen met het SOQL-stuurprogramma
  4. Update en verwijder query bulking
  5. Transactieondersteuning van Easysoft
  6. Luie schemavalidatie
  7. Beperkingen van de OLEDB voor ODBC-provider van Microsoft

Overzicht

Dit document geeft enkele tips voor het gebruik van SQL Server met Salesforce. De componenten die worden gebruikt om SQL Server met Salesforce te verbinden, zijn een SQL Server Linked Server en het Easysoft Salesforce ODBC-stuurprogramma. In dit artikel wordt beschreven hoe u SQL Server verbindt met Salesforce. Voor de voorbeelden in dit document is de naam van de gekoppelde server (waarnaar u verwijst in uw SQL-opdrachten) SFSOQL8.

Alle SQL in dit document is getest tegen SQL Server 2017 en het Easysoft Salesforce ODBC-stuurprogramma versie 2.0.0.

Als u wilt bijdragen aan dit document, kunt u uw inzending e-mailen naar .

Eenvoudige selectiequery's in SQL Server werken niet

Stel dat u deze query probeert uit te voeren in SQL Server:

SELECT Id FROM SFSOQL8...Account

SQL Server zet die SQL om in:

SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"

Omdat de Salesforce SOQL-taal het op die manier hernoemen van tabellen en kolommen niet ondersteunt, krijg je deze fout:

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 heeft twee methoden beschikbaar voor het verzenden van SOQL naar de Easysoft-driver:

  1. OPENQUERY , die kan worden gebruikt in combinatie met lokale tabellen om externe en lokale gegevens samen te voegen.
  2. EXEC die samen met parameters kan worden gebruikt om uw SOQL rechtstreeks tegen Salesforce uit te voeren.

Om deze methoden te demonstreren, beginnen we met een SOQL-tabel-join:

SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity

In SQL Server kunt u een van de volgende query's uitvoeren:

SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')

—Of—

EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8

Er is bijna geen verschil in prestatie, aangezien de SOQL die u hebt geschreven rechtstreeks naar de Salesforce-server wordt doorgegeven.

Evenzo zijn alle SOQL-functies ook beschikbaar met dezelfde methoden:

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)')

Als u een ongeldige SOQL doorgeeft, retourneert het Easysoft SOQL-stuurprogramma de fout rechtstreeks vanuit Salesforce. Bijvoorbeeld:

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". 

Meer informatie over de SOQL-taal vindt u hier.

Gegevens in bulk invoegen met behulp van het SOQL-stuurprogramma

Binnen de Salesforce SOAP API is er een functie waarmee u tot 200 rijen gegevens kunt invoegen vanuit een enkele SOAP API-aanroep. Het Easysoft Salesforce SOQL ODBC-stuurprogramma maakt gebruik van deze functie en stelt u in staat SQL Server TSQL te gebruiken om maximaal 200 rijen tegelijk in bulk te laden.

In mijn voorbeeld ga ik nieuwe records toevoegen aan het Account-object binnen Salesforce. Dit is een heel eenvoudig voorbeeld met slechts een paar kolommen met gegevens, maar ik hoop dat dit uitlegt hoe bulk-inserts mogelijk zijn vanuit SQL Server. In SQL Server heb ik een lokale tabel met de naam Account die eruitziet als:

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

Deze TSQL werkt door mijn lokale accounttabel in een cursor te lezen.

Aan het begin van het eerste blok van 200 rijen, de Begin Trans wordt aangeroepen, wat de Easysoft-driver vertelt dat alle gegevens die eraan worden doorgegeven, worden vastgehouden tot een Commit of een Rollback wordt gebeld.

De EXEC functie stuurt elke rij in de cursor naar de Easysoft-driver. De driver bouwt vervolgens de benodigde SOAP API-aanroep op. Als er 200 rijen naar Easysoft zijn gestuurd, stuur ik een Commit , waardoor de bestuurder de SOAP API-aanroep naar Salesforce stuurt.

Als het einde van de cursor is bereikt en er records zijn verzonden naar de Easysoft-driver die niet zijn doorgegeven aan Salesforce, stuur ik een laatste Commit . De cursor wordt dan gesloten en ongedaan gemaakt.

De limiet van 200 rijen is een interne limiet binnen Salesforce. Als u meer dan 200 rijen probeert te verzenden, krijgt u een Salesforce-foutmelding. Het Easysoft-stuurprogramma heeft geen ingebouwde limieten, dus als Salesforce de limiet van 200 rijen verhoogt in toekomstige versies van de SOAP API, werkt het Easysoft-stuurprogramma automatisch met de nieuwe limiet.

Wanneer u deze bulk-invoegmethode gebruikt, is er geen limiet aan het aantal tabellen waarin u gegevens kunt invoegen in een enkel blok, dus de volgende TSQL zal werken:

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

Bij gebruik van de Begin Trans/Commit-methode voor invoegingen kunt u alleen invoegopdrachten verzenden. U kunt invoegingen en updates niet mixen en matchen, aangezien dit niet wordt ondersteund in de Salesforce SOAP API.

query bulken bijwerken en verwijderen

Ons SOQL-stuurprogramma heeft een ingebouwde methode voor het bulken van gegevenstransacties, indien gebruikt met een UPDATE- of een DELETE-query.

Dit voorbeeld laat zien hoe ik een aangepaste kolom update naar een ingestelde waarde.

EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8

Salesforce ondersteunt geen UPDATE's of DELETE's met SOQL, dus het Easysoft-stuurprogramma moet de query converteren naar een SOQL SELECT. De rijen die door de SELECT worden geretourneerd, worden vervolgens opgestapeld in blokken van maximaal 200 en worden blok voor blok verzonden voor een UPDATE of DELETE.

Transactionele ondersteuning van Easysoft

Het Easysoft Salesforce SOQL ODBC-stuurprogramma ondersteunt slechts één transactieniveau. Dus een Begin Trans gevolgd door enkele INSERT's kunnen naar Salesforce worden verzonden met een COMMIT of weggegooid in de driver met behulp van een ROLLBACK .

Luie schemavalidatie

In de eigenschappen van uw SQL Server gekoppelde server onder de sectie "Serveropties" is een optie voor "Lazy Schema Validation". Standaard is dit ingesteld op FALSE, waardoor SQL Server bij het uitvoeren van een SELECT-instructie de instructie twee keer verzendt. De eerste keer dat het wordt verzonden, gebruikt SQL Server de doorgegeven details om de metagegevens over uw resultatenset op te bouwen. Daarna wordt de vraag opnieuw verzonden. Dit is nogal een dure overhead, dus Easysoft raadt aan om "Lazy Schema Validation" in te stellen op TRUE, wat betekent dat er slechts één SELECT wordt verzonden, die zowel de metagegevens als de gegevens ontvangt. Dit vermindert ook het aantal Salesforce API-aanroepen dat wordt gedaan.

Beperkingen van Microsoft's OLEDB for ODBC Provider

Details over de beperkingen van de OLEDB voor ODBC Provider zijn hier te vinden:

https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx


  1. Een goede referentie voor Oracle PL/SQL

  2. Vreemd SQLAlchemy-foutbericht:TypeError:'dict'-object ondersteunt geen indexering

  3. Hoe werkt MySQL CASE?

  4. Hoe SSMS te installeren