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

Cách bỏ qua một tham số trong thủ tục được lưu trữ nếu giá trị của nó là null

Có một bài viết rất hay Điều kiện Tìm kiếm Động trong T ‑ SQL của Erland Sommarskog. Anh ấy giải thích một số cách tiếp cận có thể được sử dụng và so sánh việc xây dựng SQL động như @ lad2025 được đề xuất và sử dụng OPTION(RECOMPILE) .

Cá nhân tôi sử dụng OPTION(RECOMPILE) trong các truy vấn này. Bạn sử dụng SQL Server 2008, vì vậy tùy chọn này là một lựa chọn tốt. Nếu bạn sử dụng tuyến SQL động, hãy nhớ đọc một bài viết khác của anh ấy Lời nguyền và phước lành của động SQL .

Vì vậy, thủ tục của bạn trở thành một cái gì đó giống như sau:

create procedure proc1
    @var1 varchar(100) = null,
    @var2 varchar(100) = null,
    @var3 varchar(100) = null,
    @var4 varchar(100) = null,
    ........   
    @var10 varchar(100) = null
as
begin
    insert into #a
    select * from
    (
        select * 
        from
            tab1 as a
            inner join tab2 as b on a.rollnumber = b.rollnumber
            inner join tab3 as c on c.city = b.city
            ........
            inner join tab10 as j on J.id = i.id
        where 
            (a.id = @var1 OR @var1 IS NULL)
            and (b.id = @var2 OR @var2 IS NULL)
            and (c.id = @var3 OR @var3 IS NULL)
            ...........
            and (J.id = @var10 OR @var10 IS NULL)
    ) as abc
    OPTION(RECOMPILE);

    if (select count(*) from #a) < 10 
    begin
        select * from #a
    end
    else 
    begin
        print 'Cannot display the records as count is more than 10'
    end
end

Nhân tiện, không rõ bạn đang cố gắng đạt được điều gì bằng cách kiểm tra count() , nhưng có thể tất cả những gì bạn cần là đơn giản TOP(10) để trả về nhiều nhất 10 hàng đầu tiên. Đảm bảo thêm ORDER BY nếu bạn sử dụng TOP để trả về kết quả một cách nhất quán. Nếu bạn không biết, bạn có thể có một tham số khác của thủ tục để chỉ ra số hàng tối đa để trả về và sử dụng nó trong TOP(@ParamMaxRowCount) . Thông thường, một thủ tục được lưu trữ đôi khi trả về tập hợp kết quả và đôi khi chỉ in một thông báo.



  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:Chỉ CHỌN các hàng có MAX (DATE)

  2. Cách nhanh nhất để xác định xem bản ghi có tồn tại hay không

  3. Tìm các thay đổi đối tượng gần đây trong Cơ sở dữ liệu SQL Server

  4. Sự khác biệt giữa các kiểu chuỗi khác nhau trong SQL Server?

  5. Bạn sử dụng kích thước nào cho varchar (MAX) trong khai báo tham số của mình?