Daftar Isi
- Ringkasan
- Kueri Pilihan Sederhana di SQL Server tidak berfungsi
- Memasukkan Data Secara Massal Menggunakan Driver SOQL
- Perbarui dan Hapus pengelompokan kueri
- Dukungan Transaksi Easysoft
- Validasi Skema Malas
- 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:
OPENQUERY
, yang dapat digunakan bersama dengan tabel lokal untuk menggabungkan data jarak jauh dan lokal.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