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

SQL nâng cao:Chèn đầu ra của hàm có giá trị bảng được tham số hóa trong bảng SQL

Trong bài viết này, tôi sẽ chứng minh những điều sau:

  1. Cách chèn đầu ra của một hàm có giá trị bảng trong bảng SQL.
  2. Cách chèn đầu ra của một hàm có giá trị bảng được tạo trên máy chủ cơ sở dữ liệu từ xa.

Câu lệnh "Chèn vào" là gì

Trong RDBMS, “Chèn vào” là một trong những câu lệnh SQL cơ bản. Nó được sử dụng để chèn các bản ghi mới trong bảng SQL. Sử dụng câu lệnh, chúng ta có thể thực hiện các tác vụ sau:

  • Chèn bản ghi mới vào bảng (Chèn cơ bản).
  • Chèn các giá trị của một cột cụ thể trong bảng.
  • Chèn kết quả đầu ra được tạo bởi một thủ tục được lưu trữ trong bảng SQL.

Để chứng minh điều trên, hãy tạo một bảng có tên “ Học sinh ”Trên DemoDatabase. Thực thi đoạn mã sau để tạo bảng:

 TẠO BẢNG SINH VIÊN (ID INT IDENTITY (1, 1) PRIMARY KEY, FIRSTNAME VARCHAR (250), LASTNAME VARCHAR (250), NGÀY NHẬP HỌC, LỚP (1)) 

Thực hiện chèn cơ bản

Để thực hiện chèn cơ bản, chúng ta cần cung cấp tên của bảng đích và các giá trị của bảng. Sau đây là cú pháp cơ bản của câu lệnh chèn cơ bản:

 CHÈN VÀO  VALUES (,  ..) 

Ví dụ:chúng tôi muốn chèn họ, tên và lớp của ba học sinh trong bảng "Học sinh". Để làm điều đó, hãy thực thi đoạn mã sau:

 CHÈN VÀO GIÁ TRỊ SINH VIÊN ('NISARG', 'UPADHYAY', '2018-09-11', 'A'), ('RAGHAV', 'DATTA', '2017-10-01', 'A') , ('KIRAN', 'AMIN', '2016-01-31', 'A') 

Thực hiện truy vấn “Chọn” đối với “Sinh viên” để xem lại kết quả.

 CHỌN FIRSTNAME, LASTNAME, TUYỂN SINH, LỚP TỪ SINH VIÊN 

Kết quả như sau:

Chèn giá trị của một cột cụ thể trong bảng

Để chèn giá trị trong các cột cụ thể của bảng, bạn cần cung cấp tên của bảng đích và tên của các cột mà bạn muốn chèn dữ liệu. Sau đây là cú pháp.

 CHÈN VÀO  (CỘT 1, CỘT 2) CÁC GIÁ TRỊ (,  ..) 

Ví dụ:chúng tôi muốn chèn họ và tên của hai học sinh trong phần “ Học sinh " bàn. Để làm điều đó, hãy thực thi đoạn mã sau:

 CHÈN VÀO GIÁ TRỊ CỦA SINH VIÊN (FIRSTNAME, LASTNAME) ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA') 

Thực thi truy vấn “Chọn” đối với “ Học sinh ”Bảng.

 CHỌN FIRSTNAME, LASTNAME, TUYỂN SINH, LỚP TỪ SINH VIÊN 

Đầu ra trông như sau:

Chèn đầu ra, tạo bằng thủ tục được lưu trữ

Để chèn đầu ra của một thủ tục được lưu trữ trong bảng, chúng ta cần chỉ định tên bảng đích và thủ tục được lưu trữ nguồn. Để tạo kết quả đầu ra của thủ tục đã lưu trữ, chúng ta cần sử dụng từ khóa “execute” hoặc “EXECUTE”. Vì vậy, chúng ta cần cung cấp tên bảng hoặc tên của các cột theo sau là từ khóa "executive". Sau đây là cú pháp:

 CHÈN VÀO  (CỘT 1, CỘT 2) EXEC  

Ví dụ, chúng tôi muốn chèn đầu ra của thủ tục điền tên của những sinh viên có ngày nhập học không bị trống. Để làm điều đó, chúng tôi sẽ tạo một thủ tục được lưu trữ có tên “ spGet_Student_AdmissionDate ”. Để tạo một thủ tục được lưu trữ, hãy thực thi đoạn mã sau:

 SỬ DỤNG DEMODATABASE ĐI TẠO THỦ TỤC SPGET_STUDENT_ADMISSIONDATE NHƯ BẮT ĐẦU CHỌN ISNULL (FIRSTNAME, '') + '' + ISNULL (LASTNAME, '') AS STUDENTNAME, TUYỂN SINH, LỚP TỪ SINH VIÊN KHI NHẬP HỌC KHÔNG ĐẦY ĐỦ 

Sau khi thủ tục được tạo, hãy chạy thủ tục bằng cách thực thi đoạn mã sau:

 THỰC HIỆN spGet_Student_Admissondate 

Đầu ra trông như sau:

Như tôi đã đề cập ở trên, chúng tôi muốn chèn đầu ra của thủ tục được lưu trữ có tên “ spGet_Student_Admissondate ”Trong một bảng tạm thời. Đầu tiên, hãy thực thi đoạn mã sau để tạo bảng:

 (ID INT IDENTITY (1, 1), STUDENTNAME VARCHAR (250), NGÀY NHẬP HỌC, GRADE CHAR (1)) 

Sau khi bảng được tạo, hãy thực thi mã sau để chèn đầu ra của “ spGet_Student_Admissondate ”Thành“ #TempStudents ”.

 CHÈN VÀO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Kết quả đầu ra:(3 hàng bị ảnh hưởng) 

Bây giờ, hãy kiểm tra đầu ra của “ #TEMPSTUDENTS ”. Để làm điều đó, hãy thực thi đoạn mã sau:

Bây giờ, như tôi đã đề cập ở trên, tôi sẽ chứng minh cách chúng ta có thể chèn đầu ra được tạo bởi một hàm có giá trị bảng trong Bảng SQL. Trước tiên, hãy hiểu hàm giá trị bảng là gì.

Hàm Table-Valued là gì

Hàm có giá trị bảng là một mã T-SQL đặc biệt chấp nhận tham số / tham số và dựa trên các điều kiện được xác định trong một biến, trả về tập kết quả trong biến bảng. Sau đây là những lợi ích của việc sử dụng hàm giá trị bảng:

  1. Nó có thể được thực thi trong truy vấn Chọn.
  2. Nó có thể được sử dụng trong nhiều phần của một truy vấn, ví dụ:trong câu lệnh Case, mệnh đề có / ở đâu.
  3. Đầu ra của một hàm có giá trị bảng là một tập bản ghi, do đó bạn có thể kết hợp hàm với các bảng.

Chèn đầu ra của hàm có giá trị bảng nội tuyến trong bảng SQL

Trong phần này, tôi sẽ giải thích cách chèn đầu ra của một hàm có giá trị bảng trong bảng SQL bằng T-SQL.

Để trình diễn, tôi đang sử dụng cơ sở dữ liệu AdventureWorks2014. Tôi đã tạo một hàm bảng đa giá trị nội tuyến có tên là “ GetEpriseesbyHireDate . ” Chức năng này điền thông tin của nhân viên, được thuê trong một ngày giờ cụ thể. Hàm sử dụng @FormDate @Toda tham số te để lọc dữ liệu. Kết quả đầu ra của hàm sẽ được lưu trữ trong Bảng SQL.

Đoạn mã sau tạo một hàm:

 TẠO CHỨC NĂNG GETEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) RETURNS @EMPLOYEES TABLE (EMPLOYEENAME VARCHAR (MAX), BIRTHDATE DATETIME, JOBTITLE VARCHAR DATETIME) NHƯ BẮT ĐẦU CHÈN VÀO @EMPLOYEES CHỌN (ISNULL (B.FIRSTNAME, '') + '' + ISNULL (B.MIDDLENAME, '') + '' + ISNULL (B.LASTNAME, '')) NHƯ NHÂN VIÊN, A .BIRTHDATE, B.JOBTITLE, B.EMAILADDRESS, B.PHONENUMBER, A.HIREDATE FROM [HUMANRESOURCES]. [EMPLOYEE] A INNER JOIN [HUMANRESOURCES]. [VEMPLOYEE] B ON A.BUSINESSENTITYID =B.BUSINESS A.WENTITYIDATE @FROMDATE VÀ @TODATE RETURN END 

Sử dụng truy vấn Chọn, chúng ta có thể nhận được kết quả của một Hàm SQL. Ví dụ:bạn muốn điền danh sách nhân viên, được tuyển dụng trong năm 2009. Thực hiện truy vấn sau để lấy danh sách:

 DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @ FROMDT ='2009-01-01' SET @ TODT ='2009-12-31' CHỌN * TỪ GETEMPLOYEESBYHIREDATE (@FROMDT, @TODT) 

Kết quả của truy vấn trên trông như sau:

Bây giờ, hãy tạo một bảng có tên là “ tblErantye e ”để lưu trữ kết quả đầu ra của“ GetEpriseesbyHariesate " hàm số. Đoạn mã sau tạo bảng có tên “ tblErantyee ”.

 TẠO BẢNG TBLEMPLOYEES (BIẾN NHÂN VIÊN (MAX), NGÀY SINH, BIẾN CÔNG VIỆC (150), BIẾN EMAILID (100), BIẾN PHONENUMBER (20), THỜI GIAN NGÀY SINH) 

Như tôi đã đề cập trước đó, chúng tôi muốn điền thông tin của nhân viên, những người đã được thuê vào năm 2009. Để làm điều đó, hãy chèn đầu ra của GetEFasteesbyHireDate trong tblE Employees bàn. Để làm điều đó, hãy thực thi đoạn mã sau:

 DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @ FROMDT ='2009-01-01' SET @ TODT ='2009-12-31' CHÈN VÀO TBLE NHÂN VIÊN CHỌN NHÂN VIÊN, SINH VIÊN, VIỆC LÀM, EMAILID, PHONENUMBER (@FROMDT, @TODT) 

Hãy xác minh rằng dữ liệu đã được chèn vào bảng. Để làm điều đó, hãy thực thi đoạn mã sau:

 CHỌN * TỪ TBLEMPLOYEES 

Đầu ra trông như sau:

Chèn dữ liệu vào bảng từ Cơ sở dữ liệu từ xa

Đôi khi, bạn có thể muốn trích xuất dữ liệu từ các máy chủ được lưu trữ trong một trung tâm dữ liệu khác. Điều này có thể được thực hiện bằng máy chủ được liên kết SQL.

Trong phần này, tôi sẽ giải thích cách chèn đầu ra của hàm có giá trị bảng, được tạo trên máy chủ từ xa. Bây giờ để chứng minh tình huống, sau đây là thiết lập.

[id bảng =57 /]

Trong bản demo, chúng tôi sẽ thực hiện các tác vụ sau:

  1. Trên máy chủ nguồn ( SQL_VM_1 ), tạo một hàm có giá trị bảng có tên “ getCustomerByCountry ”Trên“ AdventureWorks2014 Cơ sở dữ liệu ”để điền dữ liệu.
  2. Trên máy chủ đích, tạo một máy chủ được liên kết có tên “ Remote_Server ”Để thực thi hàm ( getCustomerByCountry ).
  3. Trên máy chủ đích, tạo một bảng, có tên là “ Khách hàng ”Để lưu trữ dữ liệu, được truy xuất bởi chức năng từ xa ( getCustomerByCountry ).

Hình ảnh sau đây minh họa thiết lập.

Tác vụ được thực hiện trên máy chủ Nguồn:

Trên máy chủ nguồn (SQL_VM_1 ), tạo một hàm có tên “ getCustomerByCountry . ” Nó điền thông tin chi tiết của một khách hàng ở một quốc gia hoặc khu vực cụ thể. Hàm sử dụng @CountryName tham số để lọc dữ liệu. Thực thi đoạn mã sau để tạo hàm.

 Alter FUNCTION Getcustomerbycountry (@CountryName VARCHAR) trả về @Customers TABLE (customer_name VARCHAR (500), số điện thoại VARCHAR (50), địa chỉ email VARCHAR (100), địa chỉ VARCHAR (tối đa), VARCHAR thành phố (150), quốc gia VARCHAR (250) ), mã bưu chính VARCHAR (50)) NHƯ BẮT ĐẦU CHÈN VÀO @Customers CHỌN customer_name, số phoennumber, địa chỉ email, địa chỉ, thành phố, quốc gia, mã bưu chính TỪ khách hàng TẠI ĐÂU quốc gia [email protected] QUAY LẠI KẾT THÚC 

Các tác vụ được thực hiện trên Máy chủ Đích:

Để điền dữ liệu từ máy chủ nguồn ( SQL_VM_1 ), trước tiên, hãy tạo một máy chủ được liên kết giữa nguồn ( SQL_VM_1 ) và đích đến (SQL_VM_ 2). Thực thi mã sau trên máy chủ đích ( SQL_VM_2 ) để tạo một máy chủ được liên kết.

 SỬ DỤNG [MASTER] GOEXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'SQL_VM_1 ', @ SRVPRODUCT =N'SQL SERVER'GOEXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @ RMTSRVNAME =N' Remote_Server ', @ USESALSE' =N'FALSE '=N , @ LOCALLOGIN =NULL, @ RMTUSER =N'SA ', @ RMTPASSWORD =' ######## 'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server', @ OPTNAME =N'COLLATION TƯƠNG THÍCH ', @ OPTVALUE =N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ', @ OPTNAME =N'DATA ACCESS', @ OPTVALUE =N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ' , @ OPTNAME =N'DIST ', @ OPTVALUE =N'FALSE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server', @ OPTNAME =N'PUB ', @ OPTVALUE =N'FALSE'GOEXEC MASTER.DBO. SP_SERVEROPTION @ SERVER =N'Remote_Server ', @ OPTNAME =N'RPC', @ OPTVALUE =N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ', @ OPTNAME =N'RPC OUT', @ OPTVALUE =N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ', @ OPTNAME =N'SUB', @ OPTVALUE =N'FALSE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ', @OPTN AME =N'CONNECT TIMEOUT ', @ OPTVALUE =N'0'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server', @ OPTNAME =N'COLLATION NAME ', @ OPTVALUE =NULLGOEXEC MASTER.DBO.SP_SERV =EROPTION @ SERVER N'Remote_Server ', @ OPTNAME =N'LAZY SCHEMA VALIDATION', @ OPTVALUE =N'FALSE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ', @ OPTNAME =N'QUERY TIMEOUT', @ N 'OPTVALUE 0'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ', @ OPTNAME =N'USE REMOTE COLLATION', @ OPTVALUE =N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @ SERVER =N'Remote_Server ', @ OPTNAME =KHUYẾN MÃI GIAO DỊCH N'REMOTE PROC ', @ OPTVALUE =N'FALSE'GO 

Sau khi máy chủ được liên kết được tạo, hãy tạo bảng SQL để lưu trữ thông tin của khách hàng và điền thông tin đó bằng cách thực thi hàm SQL, được tạo trên máy chủ nguồn ( SQL_VM_1 ).

Thực thi đoạn mã sau để tạo bảng.

 SỬ DỤNG KHÁCH HÀNG BẢNG DEMODATABASEGOCREATE (ID INT IDENTITY (1, 1), CUSTOMER_NAME VARCHAR (500), PHONENUMBER VARCHAR (50), EMAILADDRESS VARCHAR (100), ADDRESS VARCHAR (MAX), CITY VARCHAR), COUNTRY VARCHAR ( 250), POSTALCODE VARCHAR (50)) 

Sử dụng một máy chủ được liên kết, chúng tôi có thể thực thi hàm giá trị bảng được tạo trên một máy chủ cơ sở dữ liệu từ xa. Khi bạn cố gắng thực thi chức năng bằng Máy chủ được liên kết, lỗi sau xảy ra:

 Msg 4122, Mức 16, Trạng thái 1, Dòng 28 Các lệnh gọi hàm có giá trị bảng của Remote không được phép. 

Do đó, để thực thi bất kỳ chức năng nào trên máy chủ từ xa, chúng ta cần sử dụng từ khóa OPENQUERY. Nó được sử dụng để khởi tạo truy vấn phân tán đặc biệt bằng cách sử dụng một máy chủ được liên kết. Tham khảo bài viết này để hiểu khái niệm OPENQUERY.

Để sử dụng OPENQUERY, chúng tôi cần bật thông số cấu hình nâng cao có tên “ Truy vấn phân tán Ad Hoc ”Trên máy chủ nguồn và máy chủ đích. Thực thi đoạn mã sau để kích hoạt nó.

 SỬ DỤNG MASTERGOEXEC SP_CONFIGURE 'HIỂN THỊ TÙY CHỌN NÂNG CAO', 1 HÌNH ẢNH VỚI OVERRIDEEXEC SP_CONFIGURE 'CÁC CÂU HỎI PHÂN PHỐI QUẢNG CÁO HOC', 1 HÌNH ẢNH CÓ BÊN NGOÀI 

Bây giờ tôi muốn điền danh sách khách hàng ở Vương quốc Anh và chèn họ vào phần “ Khách hàng " bàn. Như tôi đã đề cập, hàm chấp nhận tên quốc gia để lọc các bản ghi. Bây giờ, chúng tôi cần thực thi tập lệnh sau trên máy chủ Đích ( SQL_VM_2 ) để điền danh sách khách hàng ở “Vương quốc Anh”.

 SELECT CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM OPENQUERY ([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR (150) SET @COUNTRY =' 'UNITED KINGDOM' 'SELECT * FROM [ADVENTUREWORKS2014] .DBO.GETCUSTOMERBYCOUNTRY ('' '' + @COUNTRY + '' '') ') 

Đầu ra trông như sau:

Bây giờ, để chèn dữ liệu được điền bởi bảng “Khách hàng”, hãy thực thi tập lệnh sau trên máy chủ đích ( SQL_VM_2 ).

 CHÈN VÀO KHÁCH HÀNG (CUSTOMER_NAME, PHONENUMBER, ĐỊA CHỈ EMAILAD, ĐỊA CHỈ, THÀNH PHỐ, QUỐC GIA, POSTALCODE) CHỌN CUSTOMER_NAME, PHOENNUMBER, ĐỊA CHỈ EMAILAD, ĐỊA CHỈ, THÀNH PHỐ, QUỐC GIA, POSTALCODE TỪ OPENQUERY ([TTI609-VM2] 150) SET @COUNTRY ='' UNITED KINGDOM '' CHỌN * TỪ [ADVENTUREWORKS2014] .DBO.GETCUSTOMERBYCOUNTRY ('' '' + @COUNTRY + '' '') ') / * Đầu ra * / (1913 hàng bị ảnh hưởng)  

Bây giờ, hãy xác minh xem dữ liệu đã được chèn đúng cách hay chưa. Để kiểm tra, hãy thực hiện truy vấn sau trên máy chủ Đích (SQL_VM_2).

 SỬ DỤNG DEMODATABASEGOSELECT TOP 20 CUSTOMER_NAME, PHONENUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE TỪ KHÁCH HÀNG 

Đầu ra trông như sau:

Tóm tắt

Trong bài viết này, tôi đã đề cập đến:

  1. Câu lệnh “Chèn vào” và cách sử dụng.
  2. Cách lưu kết quả của hàm có giá trị bảng trong bảng SQL.
  3. Cách lưu kết quả đầu ra của hàm có giá trị bảng vào bảng SQL nằm trên máy chủ từ xa bằng Máy chủ được Liên kết.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nối 3 bảng trong SQL

  2. Vai trò của DBA trong NoSQL

  3. Mô hình quan hệ

  4. Lập bản đồ và tạo mặt nạ dữ liệu gia tăng:Phát hiện các thay đổi và cập nhật…

  5. Giảm thiểu tác động của việc mở rộng cột IDENTITY - phần 3