PDA

View Full Version : کمک برای یک Query



mahdi_negahi
شنبه 14 مرداد 1385, 19:44 عصر
سلام دوستان

من یک جدول دارم که سه ستون دارد می خواهم از این جدولم Query با شرایط زیر بگیرم :

1-اگر کاربر برای سه ستون داده ای وارد کند هر سه ستون And شود

2-اگر برای یکی از این سه ستون داده ای وارد کند 2 ستون باقی مانده مد نظر قرار نگیرد و هر داده ای داشته باشند

توجه کنید که من می خواهم مثلا اگر کاربر برای 2 ستون داده وارد کند 2 ستون And و آن یک ستون باقی مانده اصلا مد نظر قرار نگیرد

majid_afra222
شنبه 14 مرداد 1385, 22:20 عصر
سلام
فکر کنم قبلا زیاد تو سایت این بحث شده، با اینحال یه مثال :


ALTER PROCEDURE usp_get_info
...
@f1 INT = NULL
, @f2 NVARCHAR(50) = NULL
, @f3 CHAR(10) = NULL
...
as
begin
DECLARE @str_select NVARCHAR(4000)
SET @str_select = N''
SET @str_select = N'SELECT f1, f2, f3 from tbl ' + CHAR(13)
...
--شرط
DECLARE @str_where NVARCHAR(2000)
SET @str_where = ''
--تعیین شرط
IF (@f1 IS NOT NULL)
BEGIN
--تعیین شرطهای بعدی
IF @str_where <> ''
SET @str_where = @str_where + 'AND ' + CHAR(13)
SET @str_where = @str_where + ' f1 = ' + CAST(@f1 AS VARCHAR(2)) ' ' + CHAR(13)
END
...
IF (@f2 IS NOT NULL)
BEGIN
--تعیین شرطهای بعدی
IF @str_where <> ''
SET @str_where = @str_where + 'AND ' + CHAR(13)
SET @str_where = @str_where + ' f2 = N''' +@f1 ''' ' + CHAR(13)
END
...
--و الی آخر
--یکی کردن عبارات برای انجام عمل جستجو
IF @str_where <> ''
BEGIN
SET @str_select = @str_select + CHAR(13)
+ ' WHERE ' + @str_where + CHAR(13)
END
SET @str_select = @str_select + CHAR(13)
+ ' ORDER BY f1 DESC'
--انجام جستجو
EXEC(@str_select)
end

AminSobati
شنبه 14 مرداد 1385, 22:31 عصر
اگر حالتهای ممکن به همین دو مورد ختم میشه، بهتره دو SP داشته باشید. در Client کنترل کنید که کاربر برای کدوم ستونها مقدار داده، و با توجه به اون، SP مربوطه رو اجرا کنید. اما اگر تعداد حالتها بسیار زیاده، Dynamic TSQL روش مناسبیه

mahdi_negahi
یک شنبه 15 مرداد 1385, 09:53 صبح
با تشکر ولی مهندس جون من این کارو برای یک جئول که 15 ستون دارد می خواهم انجام دهم و این چیزی که گفتم در مقیاس کوچک است

AminSobati
یک شنبه 15 مرداد 1385, 11:06 صبح
پس از جواب آقای افرا باید استفاده کنید