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

Tạo và thực thi chức năng trong SQL Server

Tôi sẽ đi với:

ALTER FUNCTION SearchProjects (
    @location NVARCHAR(50),
    @purpose NVARCHAR(50),
    @type NVARCHAR(50))
RETURNS TABLE
AS
RETURN
(
    SELECT  p.ProjectName, 
            p.Areas, 
            p.PaymentSystem, 
            p.ReceivedDate,    
            p.PropertyClassification, 
            p.ProjectImage,
            l.LocationName,
            pur.PurposeName,
            t.TypeName
    FROM dbo.Projects AS p 
    LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID      
    LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID 
    LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
    WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
    AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
    AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
     )
GO

nếu bạn chỉ muốn trả lại các Dự án trong đó tất cả trong số các tiêu chí được đáp ứng và một chuỗi trống trong tham số đầu vào được coi là ký tự đại diện:

SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records

SELECT * FROM dbo.SearchProjects('north','',''); -- Returns all records with LocationName containing 'north'
SELECT * FROM dbo.SearchProjects('','research',''); -- Returns all records with PurposeName containing 'research'
SELECT * FROM dbo.SearchProjects('','','closed'); -- Returns all records with TypeName containing 'closed'

SELECT * FROM dbo.SearchProjects('north','research',''); -- Returns all records with LocationName containing 'north' and PurposeName containing 'research'

Điều này cũng loại bỏ bất kỳ phân biệt chữ hoa chữ thường nào khi so sánh giá trị tham số đầu vào với giá trị trường trong bảng của bạn. Tôi vẫn sẽ sử dụng LEFT JOIN thay vì INNER JOIN đề phòng một số bản ghi dự án có thể có các giá trị LocationID, PurposeID hoặc TypeID bị lỗi.

Nếu bạn muốn trả lại các Dự án ở đâu bất kỳ trong số các tiêu chí từ các tham số đầu vào được đáp ứng (và không coi các tham số đầu vào trống là ký tự đại diện khi ít nhất một tham số đầu vào chứa một giá trị), bạn có thể thay đổi AND s trong WHERE mệnh đề OR s và chuyển NULL đối với bất kỳ tham số đầu vào nào mà bạn không muốn chỉ định giá trị cho:

ALTER FUNCTION SearchProjects (
    @location NVARCHAR(50),
    @purpose NVARCHAR(50),
    @type NVARCHAR(50))
RETURNS TABLE
AS
RETURN
(
    SELECT  p.ProjectName, 
            p.Areas, 
            p.PaymentSystem, 
            p.ReceivedDate,    
            p.PropertyClassification, 
            p.ProjectImage,
            l.LocationName,
            pur.PurposeName,
            t.TypeName
    FROM dbo.Projects AS p 
    LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID      
    LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID 
    LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
    WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
    OR UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
    OR UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
     )
GO


SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records

SELECT * FROM dbo.SearchProjects('north',NULL,NULL); -- Returns all records with LocationName containing 'north'
SELECT * FROM dbo.SearchProjects(NULL,'research',NULL); -- Returns all records with PurposeName containing 'research'
SELECT * FROM dbo.SearchProjects(NULL,NULL,'closed'); -- Returns all records with TypeName containing 'closed'

SELECT * FROM dbo.SearchProjects('north','research',NULL); -- Returns all records with LocationName containing 'north' or PurposeName containing 'research'

NULL Việc nhập các tham số đầu vào không mong muốn là cần thiết ở đây vì việc gọi hàm với một chuỗi trống trong bất kỳ tham số đầu vào nào sẽ dẫn đến tất cả các bản ghi được trả về:

SELECT * FROM dbo.SearchProjects('north','','');
SELECT * FROM dbo.SearchProjects('north','research','');
SELECT * FROM dbo.SearchProjects('north','','closed');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gửi email từ một trình kích hoạt trong SQL Server (T-SQL)

  2. Làm cách nào để sử dụng BCP hoặc Sql Server Management Studio để lấy dữ liệu BLOB ra khỏi Sql Server?

  3. Cách tối ưu hóa việc sử dụng mệnh đề OR khi được sử dụng với các tham số (SQL Server 2008)

  4. Làm cách nào để so sánh thời gian trong SQL Server?

  5. Loại bỏ các ràng buộc không tên