Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana mengabaikan parameter dalam prosedur tersimpan jika nilainya nol

Ada artikel yang sangat bagus Kondisi Penelusuran Dinamis di T‑SQL oleh Erland Sommarskog. Dia menjelaskan beberapa pendekatan yang dapat digunakan dan membandingkan membangun SQL dinamis seperti yang disarankan @lad2025 dan menggunakan OPTION(RECOMPILE) .

Saya pribadi menggunakan OPTION(RECOMPILE) dalam pertanyaan-pertanyaan ini. Anda menggunakan SQL Server 2008, jadi opsi ini adalah pilihan yang baik. Jika Anda pergi melalui rute SQL dinamis, pastikan untuk membaca artikelnya yang lain Kutukan dan Berkat Dinamis SQL .

Jadi, prosedur Anda menjadi seperti ini:

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

Omong-omong, tidak jelas apa yang ingin Anda capai dengan memeriksa count() , tapi mungkin yang Anda butuhkan hanyalah TOP(10) untuk mengembalikan paling banyak 10 baris pertama. Pastikan untuk menambahkan ORDER BY klausa jika Anda menggunakan TOP untuk mengembalikan hasil secara konsisten. Jika Anda tidak tahu, Anda dapat memiliki parameter lain dari prosedur Anda untuk menunjukkan jumlah maksimum baris yang akan dikembalikan dan menggunakannya di TOP(@ParamMaxRowCount) . Tidaklah umum memiliki prosedur tersimpan yang terkadang mengembalikan kumpulan hasil dan terkadang hanya mencetak pesan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jeda replikasi server SQL untuk sementara

  2. Apakah kolom TimeStamp unik?

  3. Masalah ASP klasik saat menyambung ke database SQL Server jarak jauh

  4. ADO.Net SQLCommand.ExecuteReader() melambat atau hang

  5. SQL Server SHOWPLAN_ALL