Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tips Menggunakan SQL Server dengan Salesforce SOQL

Daftar Isi

  1. Ringkasan
  2. Kueri Pilihan Sederhana di SQL Server tidak berfungsi
  3. Memasukkan Data Secara Massal Menggunakan Driver SOQL
  4. Perbarui dan Hapus pengelompokan kueri
  5. Dukungan Transaksi Easysoft
  6. Validasi Skema Malas
  7. Batasan OLEDB Microsoft untuk Penyedia ODBC

Ikhtisar

Dokumen ini memberikan beberapa tips tentang menggunakan SQL Server dengan Salesforce. Komponen yang digunakan untuk menghubungkan SQL Server ke Salesforce adalah SQL Server Linked Server dan Easysoft Salesforce ODBC Driver. Bagaimana Anda menyambungkan SQL Server ke Salesforce dijelaskan dalam artikel ini. Untuk contoh dalam dokumen ini, nama Server Tertaut (yang Anda rujuk dalam perintah SQL) yang digunakan adalah SFSOQL8.

Semua SQL dalam dokumen ini telah diuji terhadap SQL Server 2017 dan driver Easysoft Salesforce ODBC versi 2.0.0.

Jika Anda ingin berkontribusi pada dokumen ini, kirimkan kiriman Anda melalui email ke .

Kueri Pilihan Sederhana di SQL Server tidak berfungsi

Katakanlah Anda mencoba menjalankan kueri ini di SQL Server:

SELECT Id FROM SFSOQL8...Account

SQL Server mengubah SQL itu menjadi:

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

Karena bahasa SOQL Salesforce tidak mendukung penggantian nama tabel dan kolom dengan cara itu, Anda akan mengalami kesalahan ini:

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 memiliki dua metode yang tersedia untuk mengirim SOQL ke driver Easysoft:

  1. OPENQUERY , yang dapat digunakan bersama dengan tabel lokal untuk menggabungkan data jarak jauh dan lokal.
  2. EXEC yang dapat digunakan bersama dengan parameter untuk menjalankan SOQL Anda secara langsung terhadap Salesforce.

Untuk mendemonstrasikan metode ini, kita akan mulai dengan tabel SOQL join:

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

Di SQL Server, Anda dapat menjalankan salah satu kueri berikut:

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

—Atau—

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

Hampir tidak ada perbedaan kinerja karena SOQL yang Anda tulis langsung diteruskan ke server Salesforce.

Demikian juga, semua fungsi SOQL juga tersedia menggunakan metode yang sama:

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

Jika Anda memasukkan SOQL yang tidak valid, Driver Easysoft SOQL akan mengembalikan kesalahan langsung dari Salesforce. Misalnya:

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

Informasi lebih lanjut tentang Bahasa SOQL dapat ditemukan di sini.

Memasukkan Data Secara Massal Menggunakan Driver SOQL

Di dalam Salesforce SOAP API terdapat fungsi yang memungkinkan Anda memasukkan hingga 200 baris data dari satu panggilan SOAP API. Driver ODBC Easysoft Salesforce SOQL memanfaatkan fungsi ini dan memungkinkan Anda menggunakan SQL Server TSQL untuk memuat secara massal hingga 200 baris sekaligus.

Dalam contoh saya, saya akan menambahkan catatan baru ke objek Akun dalam Salesforce. Ini adalah contoh yang sangat mendasar dengan hanya beberapa kolom data, tetapi saya harap ini menjelaskan bagaimana penyisipan massal dimungkinkan dari SQL Server. Di SQL Server, saya memiliki tabel lokal bernama Akun yang terlihat seperti:

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

TSQL ini bekerja dengan membaca tabel Akun lokal saya ke kursor.

Pada awal blok pertama dari 200 baris, Begin Trans dipanggil, yang memberi tahu driver Easysoft bahwa data apa pun yang diteruskan ke sana akan ditahan hingga Commit atau Rollback disebut.

EXEC fungsi mengirimkan setiap baris yang ditemukan di kursor ke driver Easysoft. Pengemudi kemudian membangun panggilan SOAP API yang diperlukan. Ketika 200 baris telah dikirim ke Easysoft, saya mengirim Commit , yang menyebabkan driver mengirim panggilan SOAP API ke Salesforce.

Ketika akhir kursor tercapai, jika ada catatan yang dikirim ke driver Easysoft yang belum diteruskan ke Salesforce, saya mengirim Commit terakhir . Kursor kemudian ditutup dan tidak dialokasikan.

Batas 200 baris adalah batas internal dalam Salesforce. Jika Anda mencoba mengirim lebih dari 200 baris, Anda akan mendapatkan kesalahan Salesforce. Driver Easysoft tidak memiliki batasan bawaan, jadi jika Salesforce meningkatkan batas 200 baris di versi SOAP API yang akan datang, driver Easysoft akan secara otomatis bekerja dengan batas baru.

Saat menggunakan metode penyisipan massal ini, tidak ada batasan jumlah tabel tempat Anda dapat menyisipkan data dalam satu blok, sehingga TSQL berikut akan berfungsi:

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

Saat menggunakan metode Begin Trans/ Commit untuk sisipan, Anda hanya dapat mengirim pernyataan sisipan. Anda tidak dapat mencampur dan mencocokkan sisipan dan pembaruan karena ini tidak didukung di Salesforce SOAP API.

Perbarui dan Hapus pengelompokan kueri

Driver SOQL kami memiliki metode bawaan untuk transaksi data massal, bila digunakan dengan kueri UPDATE atau DELETE.

Contoh ini menunjukkan bagaimana saya memperbarui kolom khusus ke nilai yang ditetapkan.

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

Salesforce tidak mendukung UPDATE atau DELETE menggunakan SOQL, jadi driver Easysoft harus mengubah kueri menjadi SOQL SELECT. Baris yang dikembalikan dari SELECT kemudian digabungkan menjadi blok hingga 200 dan dikirim satu blok sekaligus untuk UPDATE atau DELETE.

Dukungan Transaksi Easysoft

Driver ODBC Easysoft Salesforce SOQL mendukung satu tingkat transaksi saja. Jadi Begin Trans diikuti oleh beberapa INSERT dapat dikirim ke Salesforce dengan COMMIT atau dibuang di dalam pengemudi dengan menggunakan ROLLBACK .

Validasi Skema Malas

Di properti server tertaut SQL Server Anda di bawah bagian "Opsi Server" adalah opsi untuk "Validasi Skema Malas". Secara default, ini diatur ke FALSE yang menyebabkan SQL Server saat menjalankan pernyataan SELECT untuk mengirim pernyataan dua kali. Pertama kali dikirim, SQL Server menggunakan detail yang dikirimkan kembali untuk membangun data meta tentang kumpulan hasil Anda. Kemudian kueri dikirim lagi. Ini adalah biaya tambahan yang cukup mahal, jadi Easysoft akan merekomendasikan Anda untuk menyetel "Validasi Skema Malas" ke TRUE, yang berarti hanya satu SELECT yang dikirim, yang mendapatkan data meta dan data. Ini juga mengurangi jumlah panggilan API Salesforce yang dilakukan.

Batasan OLEDB Microsoft untuk Penyedia ODBC

Detail tentang batasan OLEDB untuk Penyedia ODBC dapat ditemukan di sini:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengembalikan Daftar Fungsi Partisi di SQL Server (T-SQL)

  2. 2 Cara Mengembalikan Daftar Server Tertaut di SQL Server menggunakan T-SQL

  3. Cara Menggunakan Properti IDENTITY() di SQL Server

  4. Atur susunan basis data dalam Entity Framework Code-First Initializer

  5. Ekspor data tabel dari satu SQL Server ke yang lain