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

Kết hợp trong Transact-SQL

Giới thiệu

Giả sử bạn duy trì một bảng chứa dữ liệu khách hàng và sếp của bạn yêu cầu bạn gửi cho ông ấy danh sách khách hàng hiện tại và số điện thoại của họ. Thông thường, bạn sẽ trích xuất dữ liệu và gửi cho anh ta một bảng tính có các hàng và cột. Bạn cũng có thể quyết định trở nên sành điệu một chút và gửi cho anh ấy thông tin cần thiết ở định dạng thân thiện hơn với mọi người. SQL Server cung cấp các chức năng cho phép chúng tôi đạt được điều này bằng cách kết hợp các biểu thức tiếng Anh với dữ liệu trong bảng để trình bày kết quả đầu ra dễ đọc hơn cho những người không chuyên về kỹ thuật. Các chức năng này cũng có thể được sử dụng một cách tinh vi hơn.

Hàm CONCAT

Hàm CONCAT chấp nhận hai hoặc nhiều đối số chuỗi và trả về kết hợp của các chuỗi đó dưới dạng một biểu thức duy nhất. Điều này có thể hữu ích nếu bạn muốn hiển thị nội dung của các cột khác nhau dưới dạng một biểu thức duy nhất. Một ví dụ đơn giản về việc sử dụng hàm này được hiển thị trong Liệt kê 1.

 - Liệt kê 1:Câu lệnh CONCAT đơn giản Chọn CONCAT ('Cái này', 'Hàm', 'tham gia', 'chuỗi.') làm câu lệnh1; chọn CONCAT ('Cái này', 'Hàm', 'tham gia', 'chuỗi . ') dưới dạng câu lệnh2; chọn CONCAT (' Cái này ',' ',' Hàm ',' ',' tham gia ',' ',' chuỗi ') làm câu lệnh 

Lưu ý các biến thể của câu lệnh này bằng cách sử dụng dấu cách và kết quả trong Hình 1.

Hình. 1. Tuyên bố CONCAT đơn giản

Nếu chúng tôi cố gắng sử dụng câu lệnh CONCAT với giá trị đầu vào của kiểu dữ liệu INT, SQL Server sẽ thực hiện chuyển đổi ngầm định và vẫn trả về kết quả đầu ra là chuỗi như được hiển thị trong Hình 2. Chúng tôi có thể xác nhận rằng đây là những gì đang thực sự xảy ra bằng cách đào sâu vào chi tiết về câu lệnh trong Liệt kê 2. Trước hết, hãy xem cấu trúc của bảng mà chúng ta quan tâm. Hình 2 cho chúng ta thấy rằng PhoneNumber # FirstTranDate các cột tương ứng là các cột BIGINT và DATETIME.

Hình. 2. Cấu trúc của Bảng khách hàng

 - Liệt kê 2:Chuyển đổi ngầm định Khi sử dụng CONCAT (BIGINT) SỬ DỤNG EXAMGOSELECT CONCAT (tên, '', họ, '' s ',' Số điện thoại là ', số điện thoại1) TỪ KHÁCH HÀNG; 

Xem qua kế hoạch thực thi cho chúng ta thấy rằng SQL Server thực hiện một chuyển đổi ngầm định trên cột PhoneNumber1. Điều này sẽ giống như vậy nếu cột là kiểu dữ liệu ngày tháng như hiển thị trong Liệt kê 4 và Hình 4. Hàm CONCAT thực hiện chuyển đổi ngầm định dựa trên các quy tắc được nêu trong biểu đồ được hiển thị trong Hình 6.

Hình. 3. Chuyển đổi ngầm định kiểu dữ liệu BIGINT thành VARCHAR

 - Liệt kê 3:Chuyển đổi ngầm định Khi sử dụng CONCAT (DATETIME) SỬ DỤNG EXAMGOSELECT FirstTranDate, CONCAT (FirstName, '', LastName, '' s ',' ngày giao dịch đầu tiên là ', FirstTranDate) làm STMTFROM CUSTOMER;  

Hình. 4. Chuyển đổi ngầm của DATETIME kiểu dữ liệu thành VARCHAR

Hình. 5. Chuyển đổi ngầm định kiểu dữ liệu BIGINT thành VARCHAR

Hình. 6. Chuyển đổi kiểu dữ liệu trong SQL Server

Trường hợp sử dụng chính cho hàm này có thể được suy ra từ các minh họa ở trên. Một ví dụ sẽ là trường hợp một số thông tin cần được hiển thị trên trang tổng quan hoặc trang web bằng ngôn ngữ thân thiện hơn bằng cách sử dụng dữ liệu từ một số cột hoặc thậm chí các bảng riêng biệt.

Hàm CONCAT_WS

Hàm CONCAT_WS là một phần mở rộng của hàm CONCAT. Nó cho phép chúng tôi chỉ định một dấu phân tách mong muốn làm tham số đầu tiên. Liệt kê 4 cho chúng ta thấy bản sửa đổi của một trong những câu lệnh mà chúng ta đã sử dụng trước đây trong Liệt kê 1.

 - Liệt kê 4 Sử dụng CONCAT_WSSELECT CONCAT ('This', '', 'Function', '', 'joins', '', 'string') Câu lệnh AS; SELECT CONCAT ('This', '', ' Hàm ',' ',' tham gia ',' ',' chuỗi ') Câu lệnh AS; SELECT CONCAT_WS (' ',' Cái này ',' Hàm ',' tham gia ',' chuỗi ') Câu lệnh AS; 

Lưu ý rằng CONCAT_WS làm cho việc tạo một câu lệnh với khoảng trắng làm dấu phân cách đơn giản hơn so với việc giới thiệu một khoảng trắng làm đối số sau mỗi đối số.

 - Liệt kê 5 Sử dụng CONCAT_WS với CộtUSE EXAMGOSELECT CONCAT (tên, '', họ, '' s ',' Số điện thoại là ', số điện thoại1) TỪ CUSTOMER; SỬ DỤNG EXAMGOSELECT CONCAT_WS (' ', tên, họ,' 's', 'Phone number is', phonenumber1) TỪ KHÁCH HÀNG; 

Nối bằng dấu “+”

SQL Server hỗ trợ việc sử dụng dấu “+” để đạt được những gì hàm CONCAT thực hiện theo cách đơn giản hơn nhiều. Cách tiếp cận này thường được sử dụng để tạo các câu lệnh T-SQL khi bạn cần thực hiện các hoạt động trên một số lượng lớn các đối tượng. Liệt kê 7 cho thấy cách chúng tôi có thể tạo một lô cập nhật Thống kê cho tất cả các bảng trong cơ sở dữ liệu Bài kiểm tra.

 - Liệt kê 6 Tạo Báo cáo Thống kê Cập nhậtUSE ExamGOSELECT 'CẬP NHẬT THỐNG KÊ' + name + 'VỚI MẪU 25 PERCENT;' dưới dạng STMT từ sys.tables; CHỌN 'CẬP NHẬT THỐNG KÊ [' ​​+ name + '] VỚI MẪU 25 PERCENT;' dưới dạng STMT từ sys.tables; GO 

Lưu ý dấu ngoặc vuông trong câu lệnh thứ hai. Nó hữu ích khi xử lý một đối tượng hệ thống có khoảng trắng hoặc ký tự đặc biệt.

 - Liệt kê 7 Tạo Tạo Tuyên bố Người dùngUSE MASTERGOSELECT 'TẠO NGƯỜI DÙNG [' + LOGINNAME + '] CHO ĐĂNG NHẬP [' + LOGINNAME + '];' NHƯ STMT TỪ SYSLOGINSỞ đâu ĐĂNG NHẬP KHÔNG THÍCH '#%'; GOUSE EXAMGOCREATE USER [sa] ĐỂ ĐĂNG NHẬP [sa]; TẠO NGƯỜI DÙNG [EPG-KIGIRI \ ekocauris] ĐỂ ĐĂNG NHẬP [EPG-KIGIRI \ ekocauris]; TẠO NGƯỜI DÙNG [KAIROSgiri] ĐỂ ĐĂNG NHẬP [KAIROSAFRIKA \ kigiri]; TẠO NGƯỜI DÙNG [DỊCH VỤ NT \ SQLWriter] ĐỂ ĐĂNG NHẬP [DỊCH VỤ NT \ SQLWriter]; TẠO NGƯỜI DÙNG [DỊCH VỤ NT \ Winmgmt] ĐỂ ĐĂNG NHẬP [DỊCH VỤ NT \ Winmgmt]; TẠO NGƯỜI DÙNG [Dịch vụ NT \ MSSQL $ I2019] ĐỂ ĐĂNG NHẬP [NT Service \ MSSQL $ I2019]; TẠO NGƯỜI DÙNG [NT AUTHORITY \ SYSTEM] ĐỂ ĐĂNG NHẬP [NT AUTHORITY \ SYSTEM]; TẠO NGƯỜI DÙNG [NT SERVICE \ SQLAgent $ I2019] ĐỂ ĐĂNG NHẬP [NT SERVICE \ SQLAgent $ I2019]; TẠO NGƯỜI DÙNG [DỊCH VỤ NT \ SQLTELEMETRY $ I2019] ĐỂ ĐĂNG NHẬP [DỊCH VỤ NT \ SQLTELEMETRY $ I2019]; TẠO NGƯỜI DÙNG [KAIROSAFRIKA \ sberko] ĐỂ ĐĂNG NHẬP [KAIROSAFRIKA \ sberko]; ĐI 

Khi đầu ra được tạo, nó có thể được sử dụng để tạo người dùng trong bất kỳ cơ sở dữ liệu mong muốn nào như được hiển thị trong Liệt kê 7. Lưu ý rằng chúng tôi đã thêm một bộ lọc cho các tên đăng nhập mà chúng tôi quan tâm. Cách tiếp cận này có thể được sử dụng để tạo tất cả các loại câu lệnh và gọi các câu lệnh như vậy trong cùng một phiên. Một ví dụ phức tạp hơn là các câu lệnh sau đây xây dựng lại một cách sáng tạo tất cả các chỉ mục trong bất kỳ cơ sở dữ liệu nào. (Xem Liệt kê 8 và 9).

 - Liệt kê 8 Tạo chỉ mục Tạo lại câu lệnh '] ON [' + SCHEMA_NAME (C.SCHEMA_ID) + ']. [' + OBJECT_NAME (A.OBJECT_ID) + '] REBUILD VỚI (ONLINE =OFF, FILLFACTOR =80, SORT_IN_TEMPDB =ON, PAD_INDEX =ON, STATISTICS_NORECOMPUTE =OFF ); '- INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID (), NULL, NULL, NULL, NULL) AS A THAM GIA SYS.INDEXES AS B THAM GIA SYS.OBJECTS AS CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B .OBJECT_ID AND A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30; SELECT * FROM #INDTAB; GODROP TABLE #INDTAB; GO - Liệt kê 9 Tạo và thực thi chỉ mục xây dựng lại các câu lệnhUSE EXAMGOCREATE TABLE #INDTAB (ID SMALLINTENTITY ID , REBUILDSTMT NVARCHAR (600)) CHÈN VÀO #INDTAB CHỌN 'ĐẶT QUOTED_IDENTIFIER ON; ALTER INDEX [' + B.NAME + '] ON [' + SCHEMA_NAME (C.SCHEMA_ID) + ']. [' + OBJECT_NAME (A.OBJECT _ID) + '] REBUILD WITH (ONLINE =OFF, FILLFACTOR =80, SORT_IN_TEMPDB =ON, PAD_INDEX =ON, STATISTICS_NORECOMPUTE =OFF);' - INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID (), NULL, NULL, NULL, NULL, NULL, NULL ) NHƯ A THAM GIA SYS.INDEXES NHƯ B THAM GIA SYS.OBJECTS AS CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B.OBJECT_ID VÀ A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30; GODECLARE @SQL NVARCHAR (4000); SELECT @ SQL =REBUILDSTMT FROM #INDTAB; PRINT @SQLEXEC SP_EXECUTESQL @SQL; GODROP TABLE #INDTAB; GO 

Truy vấn trong Liệt kê 10 cho thấy cách chúng ta có thể kết hợp các chuỗi với ngày tháng được chuyển đổi thành chuỗi một cách rõ ràng. Kết nối chuỗi được sử dụng để tạo biến đường dẫn dự phòng chung mà sau này được sử dụng trong hàm SP_MSFOREACHDB.

 - Liệt kê 10 Tạo đường dẫn sao lưu chungEXEC SP_MSFOREACHDB @ COMMAND1 ='DECLARE @BACKUP SYSNAMESET @ BACKUP =N''G:\ BACKUP \?' '+ CONVERT (NVARCHAR, GETDATE (), 112) + N' ' .BAK''USE [?] NẾU ''? '' KHÔNG TRONG ("MODEL", "TEMPDB") BẮT ĐẦU CƠ SỞ DỮ LIỆU DỰ PHÒNG? TO DISK =@BACKUP VỚI INIT, NOUNLOAD, COMPRESSION, NAME =N ''? '', NOSKIP, NOFORMATEND '

Kết luận

Trong bài viết này, chúng tôi đã chỉ ra một số cách để sử dụng nối trong SQL Server. Chúng tôi đã đưa ra các ví dụ về hàm CONCAT, hàm CONCAT_WS và việc sử dụng dấu “+”. Cả ba phương pháp đều có thể rất hữu ích trong việc tạo các câu lệnh bằng cách kết hợp các giá trị từ các cột khác nhau hoặc đơn giản là để hiển thị thông tin ở định dạng thân thiện với mọi người mong muốn. Tài liệu của Microsoft có thêm thông tin về cú pháp và khả năng của các chức năng này.

Tài liệu tham khảo

Truyền và chuyển đổi (Transact-SQL)

Concat Transact-SQL

Concat_ws Transact-SQL

Nối chuỗi


  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 bảng dữ liệu làm tham số cho các thủ tục được lưu trữ

  2. Hạn chế một máy chủ được liên kết với một đăng nhập cục bộ duy nhất (Ví dụ T-SQL)

  3. Nhiều khóa chính có thể tồn tại trên một bảng không?

  4. Không phải bạn, mà là tôi (xử lý sự cố I / O)

  5. Mức cô lập SNAPSHOT