Mục lục
- Tổng quan
- Các truy vấn chọn đơn giản trong SQL Server không hoạt động
- Chèn hàng loạt dữ liệu bằng Trình điều khiển SOQL
- Cập nhật và Xóa các cụm từ truy vấn
- Hỗ trợ Giao dịch Easysoft
- Xác thực giản đồ lười biếng
- Hạn chế của OLEDB của Microsoft dành cho Nhà cung cấp ODBC
Tổng quan
Tài liệu này đưa ra một số mẹo sử dụng SQL Server với Salesforce. Các thành phần được sử dụng để kết nối SQL Server với Salesforce là Máy chủ liên kết SQL Server và Trình điều khiển ODBC Easysoft Salesforce. Cách bạn kết nối SQL Server với Salesforce được mô tả trong bài viết này. Đối với các ví dụ trong tài liệu này, tên Máy chủ được Liên kết (mà bạn tham chiếu trong các lệnh SQL của mình) được sử dụng là SFSOQL8.
Tất cả SQL trong tài liệu này đã được kiểm tra dựa trên SQL Server 2017 và trình điều khiển Easysoft Salesforce ODBC phiên bản 2.0.0.
Nếu bạn muốn đóng góp cho tài liệu này, vui lòng gửi email đến.
Truy vấn chọn đơn giản trong SQL Server không hoạt động
Giả sử bạn đang cố gắng chạy truy vấn này trong SQL Server:
CHỌN Id TỪ Tài khoản SFSOQL8 ...
SQL Server chuyển đổi SQL đó thành:
CHỌN "Tbl1002". "Id" "Col1004" TỪ "Tài khoản" "Tbl1002"
Vì ngôn ngữ SOQL của Salesforce không hỗ trợ đổi tên bảng và cột theo cách đó, bạn sẽ gặp phải lỗi này:
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 có sẵn hai phương pháp để gửi SOQL tới trình điều khiển Easysoft:
-
OPENQUERY
, có thể được sử dụng cùng với các bảng cục bộ để kết hợp dữ liệu cục bộ và từ xa. -
EXEC
có thể được sử dụng cùng với các thông số để chạy trực tiếp SOQL của bạn với Salesforce.
Để chứng minh các phương pháp này, chúng ta sẽ bắt đầu với một phép nối bảng SOQL:
CHỌN Id, Số lượng, Tên, (CHỌN Số lượng, Giá niêm yết, Bảng giáEntry.UnitPrice, Bảng giáEntry.Name FROM OpportunityLineItems) TỪ Cơ hội
Trong SQL Server, bạn có thể chạy một trong các truy vấn sau:
SELECT * FROM OPENQUERY (SFSOQL8, 'SELECT Id, Amount, Name, (SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems) FROM Opportunity')
—Hay—
EXEC ('CHỌN Id, Số lượng, Tên, (CHỌN Số lượng, Giá Danh sách, Bảng GiáHầu như không có sự khác biệt về hiệu suất vì SOQL bạn đã viết được chuyển thẳng đến máy chủ Salesforce.
Tương tự như vậy, tất cả các hàm SOQL cũng có sẵn bằng cách sử dụng các phương pháp tương tự:
SELECT * FROM OPENQUERY (SFSOQL8, 'select Id, Name, DISTANCE (CustLocation__c, GEOLOCATION (37.775, -122.418),' 'mi' ') từ Tài khoản có Tên như' '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), NHÓM (BillingCountry) ')Nếu bạn chuyển SOQL không hợp lệ, Trình điều khiển SOQL Easysoft sẽ trả lại lỗi trực tiếp từ Salesforce. Ví dụ:
SELECT * FROM OPENQUERY (SFSOQL8, 'select Id, Name, DISTANCE (CustLocation__c, GEOLOCATION (37.775, -122.418),' 'mo' ') từ Tài khoản có Tên như' 'Bur%' '')Nhà cung cấp OLE DB "MSDASQL" cho máy chủ được liên kết "SFSOQL8" đã trả lại thông báo "[Easysoft] [Trình điều khiển ODBC Salesforce SOQL] Lỗi chung:Truy vấn không thành công:'INVALID_FIELD:chọn Id, Tên, KHOẢNG CÁCH (CustLocation__c, GEOLOCATION (37.775 ^ ERROR tại Hàng:1:Cột:27 Đơn vị khoảng cách không hợp lệ:tháng. Đơn vị hợp lệ:'mi', 'km' '". Msg 7320, Mức 16, Trạng thái 2, Dòng 1 Không thể thực hiện truy vấn" chọn Id, Tên, DISTANCE (CustLocation__c, GEOLOCATION (37.775, -122.418), 'mo') từ Tài khoản có Tên như 'Bur%' "chống lại nhà cung cấp OLE DB" MSDASQL "cho máy chủ được liên kết" SFSOQL8 ".Có thể tìm thấy thêm thông tin về Ngôn ngữ SOQL tại đây.
Chèn hàng loạt dữ liệu bằng trình điều khiển SOQL
Trong API SOAP của Salesforce có một chức năng cho phép bạn chèn tối đa 200 hàng dữ liệu từ một lệnh gọi API SOAP. Trình điều khiển ODBC Easysoft Salesforce SOQL sử dụng chức năng này và cho phép bạn sử dụng SQL Server TSQL để tải hàng loạt lên đến 200 hàng cùng một lúc.
Trong ví dụ của tôi, tôi sẽ thêm các bản ghi mới vào đối tượng Tài khoản trong Salesforce. Đây là một ví dụ rất cơ bản với chỉ một vài cột dữ liệu, nhưng tôi hy vọng điều này giải thích cách có thể thực hiện chèn hàng loạt từ SQL Server. Trong SQL Server, tôi có một bảng cục bộ có tên là Tài khoản trông giống như sau:
begin khai báo @BlockCount as int khai báo @IsPosted as int khai báo @PrmName As nvarchar (255) khai báo @PrmAddress As nvarchar (255) khai báo @PrmTown As nvarchar (40) khai báo @PrmPostCode As nvarchar (30) khai báo @PrmDescription As nvarchar (255) khai báo @SQL là nvarchar (255) set @ BlockCount =0 set @ SQL ='insert vào Account (Name, BillingStreet, BillingCity, BillingPostalCode, Description) giá trị (?,?,?,?,?)' khai báo select_cursor con trỏ cục bộ FORWARD_ONLY cho AccName được chọn, "Mô tả thuộc tính", "Địa chỉ", Thị trấn, Mã bưu điện từ Thứ tự tài khoản theo Id mở select_cursor tìm nạp tiếp theo từ select_cursor vào @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription trong khi @@ FETCH_STATUS =0 bắt đầu nếu (@ BlockCount =0) Bắt đầu đặt @ IsPosted =0 thực thi ('Bắt đầu chuyển') tại SFSOQL8 kết thúc tập @ BlockCount =@ BlockCount + 1 thực thi (@SQL, @PrmName, @PrmAddress, @PrmTown, @PrmPostCode , @PrmDescription) tại SFSOQL8 nếu (@ BlockCount =200) Bắt đầu đặt @ IsPosted =1 thực thi ('Cam kết') tại SF Tiếp theo tìm nạp kết thúc SOQL8 từ select_cursor vào @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription kết thúc nếu (@ IsPosted =0) bắt đầu thực thi ('Cam kết') tại SFSOQL8 kết thúc đóng select_cursor; deallocate select_cursor; endTSQL này hoạt động bằng cách đọc bảng Tài khoản cục bộ của tôi thành một con trỏ.
Ở đầu khối 200 hàng đầu tiên,
Begin Trans
được gọi, điều này cho trình điều khiển Easysoft biết rằng mọi dữ liệu được chuyển đến nó sẽ được giữ cho đến khi cóCommit
hoặcRollback
được gọi là.
EXEC
hàm gửi từng hàng được tìm thấy trong con trỏ tới trình điều khiển Easysoft. Sau đó, trình điều khiển xây dựng lệnh gọi API SOAP được yêu cầu. Khi 200 hàng đã được gửi đến Easysoft, tôi gửiCommit
, điều này khiến trình điều khiển gửi lệnh gọi API SOAP tới Salesforce.Khi đến cuối con trỏ, nếu có bất kỳ bản ghi nào được gửi đến trình điều khiển Easysoft chưa được chuyển đến Salesforce, tôi gửi
Commit
cuối cùng . Sau đó, con trỏ được đóng lại và được phân bổ.Giới hạn 200 hàng là giới hạn nội bộ trong Salesforce. Nếu bạn cố gắng gửi hơn 200 hàng, bạn sẽ gặp lỗi Salesforce. Trình điều khiển Easysoft không có giới hạn tích hợp, vì vậy nếu Salesforce tăng giới hạn 200 hàng trong các phiên bản API SOAP trong tương lai, trình điều khiển Easysoft sẽ tự động hoạt động với giới hạn mới.
Khi sử dụng phương pháp chèn hàng loạt này, không có giới hạn về số lượng bảng mà bạn có thể chèn dữ liệu vào trong một khối, vì vậy TSQL sau sẽ hoạt động:
Bắt đầu thực thi ('Bắt đầu chuyển đổi') tại SFSOQL8 giá trị Thực thi ('Chèn vào Tài khoản (Tên) giá trị (' 'Kiểm tra Richard' ')') tại SFSOQL8 thực thi ('Chèn vào Cơ hội (Tên, Tên giai đoạn, Ngày đóng) ( '' Richard Test '', '' My Stage '', '' 2018-08-14T10:07:00Z '') ') tại SFSOQL8 executive (' Cam kết ') tại SFSOQL8EndKhi sử dụng phương thức Begin Trans / Cam kết cho các phần chèn, bạn chỉ có thể gửi các câu lệnh chèn. Bạn không thể kết hợp và kết hợp các chèn và cập nhật vì điều này không được hỗ trợ trong API Salesforce SOAP.
Cập nhật và Xóa khối lượng lớn truy vấn
Trình điều khiển SOQL của chúng tôi có một phương thức tích hợp để giao dịch dữ liệu lớn, khi được sử dụng với truy vấn CẬP NHẬT hoặc XÓA.
Ví dụ này cho thấy cách tôi cập nhật cột tùy chỉnh thành giá trị đã đặt.
EXEC ('CẬP NHẬT TÀI KHOẢN ĐẶT KHẢ NĂNG KHÁCH HÀNG_c =' 'low' 'WHERE CustomerPosystem__c =NULL') tại SFSOQL8Salesforce không hỗ trợ CẬP NHẬT hoặc XÓA bằng SOQL, vì vậy trình điều khiển Easysoft phải chuyển đổi truy vấn thành SOQL SELECT. Các hàng được trả về từ CHỌN sau đó được tăng lên thành các khối lên đến 200 và được gửi một khối tại một thời điểm để CẬP NHẬT hoặc XÓA.
Hỗ trợ giao dịch Easysoft
Trình điều khiển Easysoft Salesforce SOQL ODBC chỉ hỗ trợ một mức giao dịch duy nhất. Vì vậy, một
Begin Trans
tiếp theo là một số CHÈN có thể được gửi đến Salesforce vớiCOMMIT
hoặc bị vứt bỏ trong trình điều khiển bằng cách sử dụngROLLBACK
.Xác thực giản đồ lười biếng
Trong thuộc tính máy chủ được liên kết SQL Server của bạn trong phần "Tùy chọn máy chủ" là một tùy chọn cho "Xác thực lược đồ lười biếng". Theo mặc định, điều này được đặt thành FALSE khiến SQL Server khi chạy câu lệnh SELECT sẽ gửi câu lệnh hai lần. Lần đầu tiên nó được gửi SQL Server sử dụng các chi tiết được chuyển lại để xây dựng dữ liệu meta về tập kết quả của bạn. Sau đó, truy vấn được gửi lại. Đây là một chi phí khá tốn kém, vì vậy Easysoft khuyên bạn nên đặt "Lazy Schema Validation" thành TRUE, có nghĩa là chỉ một SELECT được gửi đi, lấy cả dữ liệu meta và dữ liệu. Điều này cũng làm giảm số lượng lệnh gọi API Salesforce được thực hiện.
Hạn chế của OLEDB của Microsoft dành cho Nhà cung cấp ODBC
Thông tin chi tiết về các hạn chế của OLEDB dành cho Nhà cung cấp ODBC có thể được tìm thấy tại đây:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx