Trong một số trường hợp với SQL Server, có thể có một trường hợp mà bạn muốn lấy dữ liệu kết quả từ một thủ tục được lưu trữ và chèn nó vào một bảng tạm thời để sử dụng trong một truy vấn khác. Việc xác định cách hoàn thành nhiệm vụ này có thể hơi khó khăn, vì vậy chúng tôi sẽ phác thảo ngắn gọn một số tùy chọn, tùy thuộc vào nhu cầu cụ thể và cấu hình cơ sở dữ liệu của bạn.
Trước khi xem xét các phương pháp cụ thể, hãy tạo một quy trình mẫu. Mặc dù không đặc biệt hữu ích, hãy tạo BooksByPrimaryAuthor
thủ tục chấp nhận @PrimaryAuthor
tham số và lấy bản ghi từ books
của chúng tôi bảng trong đó @PrimaryAuthor
diêm. Câu lệnh tạo thủ tục có thể trông giống như sau:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Lý tưởng nhất, những gì chúng tôi muốn làm là một cái gì đó như thế này, nơi chúng tôi SELECT
dữ liệu kết quả từ quy trình của chúng tôi và chèn nó vào một bảng tạm thời:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Vấn đề là cú pháp trên không đúng và sẽ không hoạt động . Chúng tôi cần một phương pháp mới.
Sử dụng Câu lệnh OPENROWSET
Một khả năng là sử dụng OPENROWSET
câu lệnh cho phép bạn truy cập dữ liệu từ xa từ nguồn OLE DB và có thể được thực thi trực tiếp từ bên trong một câu lệnh SQL khác. OPENROWSET
là phương thức truy xuất dữ liệu và kết nối một lần, vì vậy nó không nên được sử dụng cho các kết nối thường xuyên (trong trường hợp đó, việc liên kết máy chủ được ưu tiên hơn).
OPENROWSET
có thể là mục tiêu của bất kỳ INSERT
nào , DELETE
hoặc UPDATE
, điều này làm cho nó trở nên lý tưởng cho mục đích “thực thi” thủ tục đã lưu trữ của chúng tôi cho chúng tôi và trích xuất dữ liệu đó trở lại bảng tạm thời đang chờ của chúng tôi.
Trước khi sử dụng OPENROWSET
, có thể cần phải sửa đổi một số tùy chọn cấu hình, cụ thể là bằng cách cho phép truy cập đột xuất. Điều này có thể được định cấu hình bằng cách sử dụng các câu lệnh sau:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Bây giờ chúng ta có thể sử dụng OPENROWSET
, có một cú pháp cụ thể phải được tuân theo:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Do đó, chúng tôi có thể thực hiện quy trình đã lưu trữ của mình thông qua OPENROWSET
và chuyển nó vào bảng tạm thời của chúng ta như sau:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Bạn có thể cần thay đổi PROVIDER_NAME
và DATA_SOURCE
giá trị cho các mục đích của riêng bạn.
Sử dụng một chức năng do người dùng xác định
Có một vài nhược điểm đối với OPENROWSET
, cụ thể là nó yêu cầu quyền / cấu hình đặc biệt như chúng ta đã thấy ở trên và cả OPENROWSET
chỉ có khả năng trả về một tập kết quả duy nhất (nếu cung cấp nhiều tập hợp, thì chỉ tập kết quả đầu tiên được trả về).
Do đó, một phương pháp khác để thực hiện tác vụ này là thay thế một cách hiệu quả thủ tục được lưu trữ bằng một hàm do người dùng xác định.
Từ ví dụ của chúng tôi, nó sẽ trông giống như sau:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Sau đó, hàm này có thể được sử dụng theo cách tương tự như mong muốn ở trên bằng cách sử dụng OPENROWSET
:
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
Trong trường hợp bạn thực sự cần một thủ tục được lưu trữ, bạn cũng có thể gói chức năng của mình trong một thủ tục được lưu trữ.