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.