Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách Chèn kết quả của một thủ tục đã lưu trữ vào một bảng tạm thời trong SQL Server

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_NAMEDATA_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ữ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 Spatial:tìm một điểm trong đa giác

  2. Perfect Storm để nâng cấp lên phiên bản SQL Server hiện đại

  3. 6 cách kiểm tra kích thước của cơ sở dữ liệu trong SQL Server bằng T-SQL

  4. Làm cách nào để bạn có được các tìm kiếm toàn văn bằng ký tự đại diện hàng đầu hoạt động trong SQL Server?

  5. Cách chèn dữ liệu vào SQL Server