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

Cách chọn một tập hợp con các cột từ một tập kết quả của thủ tục được lưu trữ (T-SQL)

Bạn đã bao giờ chạy một thủ tục được lưu trữ, chỉ để bị choáng ngợp với số lượng cột được trả về? Có thể bạn chỉ cần một hoặc hai cột, nhưng nó đã giới thiệu cho bạn cách quá nhiều cột cho nhu cầu của bạn vào dịp cụ thể này.

May mắn thay, có một mẹo nhỏ bạn có thể sử dụng để truy xuất các cột đã chọn từ một quy trình được lưu trữ. Điều này cho phép bạn chỉ lấy các cột bạn cần.

Và điều tốt nhất là, nó không liên quan đến việc phải tạo các bảng tạm thời và xáo trộn dữ liệu xung quanh.

Tất cả những gì bạn cần làm là chuyển quy trình đã lưu trữ của mình vào OPENROWSET() hàm số.

Khái niệm tương tự có thể được áp dụng cho OPENQUERY() chức năng.

Ví dụ

Lấy sp_columns thủ tục lưu trữ hệ thống chẳng hạn. Nó trả về 19 cột.

EXEC sp_columns Cats;

Kết quả:

+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME    | PRECISION   | LENGTH   | SCALE   | RADIX   | NULLABLE   | REMARKS   | COLUMN_DEF   | SQL_DATA_TYPE   | SQL_DATETIME_SUB   | CHAR_OCTET_LENGTH   | ORDINAL_POSITION   | IS_NULLABLE   | SS_DATA_TYPE   |
|-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------|
| Pets              | dbo           | Cats         | CatId         | 4           | int identity | 10          | 4        | 0       | 10      | 0          | NULL      | NULL         | 4               | NULL               | NULL                | 1                  | NO            | 56             |
| Pets              | dbo           | Cats         | CatName       | 12          | varchar      | 60          | 60       | NULL    | NULL    | 1          | NULL      | NULL         | 12              | NULL               | 60                  | 2                  | YES           | 39             |
+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+

Các quy trình như thế này thường yêu cầu chúng ta phải cuộn sang một bên trong cuộc rượt đuổi ngỗng trời để tìm các cột mà chúng ta quan tâm.

Có thể chúng ta chỉ muốn xem 4 cột cụ thể thay vì tất cả 19.

Chúng tôi có thể chạy truy vấn sau để thực hiện điều đó.

SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENROWSET(
    'SQLOLEDB', 
    'SERVER=localhost;Trusted_Connection=yes;', 
    'EXEC Pets.dbo.sp_columns Cats'
    ) c;

Kết quả:

+---------------+--------------+-------------+----------+
| COLUMN_NAME   | TYPE_NAME    | PRECISION   | LENGTH   |
|---------------+--------------+-------------+----------|
| CatId         | int identity | 10          | 4        |
| CatName       | varchar      | 60          | 60       |
+---------------+--------------+-------------+----------+

OPENROWSET() hàm được thiết kế chủ yếu để truy xuất dữ liệu từ xa, nhưng bạn cũng có thể sử dụng nó trên phiên bản cục bộ, bằng cách chỉ định localhost trong chuỗi kết nối (như tôi đã làm trong ví dụ này).

Hàm OPENQUERY ()

Như đã đề cập, khái niệm tương tự có thể được áp dụng cho OPENQUERY() chức năng.

SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENQUERY(
    Homer,
    'EXEC Pets.dbo.sp_columns Cats'
    ) c;

Kết quả:

+---------------+--------------+-------------+----------+
| COLUMN_NAME   | TYPE_NAME    | PRECISION   | LENGTH   |
|---------------+--------------+-------------+----------|
| CatId         | int identity | 10          | 4        |
| CatName       | varchar      | 60          | 60       |
+---------------+--------------+-------------+----------+

Trong trường hợp này, tôi đã chỉ định một máy chủ được liên kết có tên là Homer thay vì máy chủ cục bộ.

Nếu bạn gặp lỗi cho biết “Máy chủ không được định cấu hình cho TRUY CẬP DỮ LIỆU”, bạn cần bật quyền truy cập dữ liệu cho máy chủ, ngay cả khi bạn đang truy vấn phiên bản cục bộ của mình. Xem Cách Bật / Tắt Quyền truy cập Dữ liệu để biết hướng dẫn về cách thực hiện việc này.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi thời gian thập phân thành giờ và phút

  2. CHÈN SỐ LƯỢNG LỚN SQL Server từ Linux

  3. Truy vấn cực kỳ chậm trong mã nhưng nhanh trong SSMS

  4. Trả về danh sách cấu hình thư cơ sở dữ liệu trong SQL Server (T-SQL)

  5. Đăng nhập vào Microsoft SQL Server Lỗi:18456