PDA

View Full Version : یا یک انتخاب یا همه در مقدار ورودی stored procedure



Shahram1974
یک شنبه 10 تیر 1386, 16:41 عصر
سلام دوستان

من یک Sp دارم یه مقدار ورودی داره که پیش فرض null هست برای اینکه بتونم کاربر اگه مقداری انخاب نکرد بتونم همه رکوردهارو بیارم شرط زیر زو توو select گذاشتم ولی وقتی sp v, اجرا می کنم موقعی که کاربر مقدار وارد می کنه خروجی درست میده ولی وقتی مقدار وارد نمی کنه
خروجی هیچی نمیده ؟



create mysp(@condition as nvarchar=null)
....
....
where



(field1 LIKE @condition OR field1 IS NULL)

rezaei manesh
یک شنبه 10 تیر 1386, 18:47 عصر
sp ظاهراً درسته
فقط اون as فکر کنم ضروری نیست


create mysp(@condition nvarchar=null)

فکر کنم مشکل از فرا خوانی sp باشه

Shahram1974
یک شنبه 10 تیر 1386, 20:36 عصر
مرسی آقای رضایی منش

من sp رو از تو خود database هم که اخرا میکنک همین مشکل رو دارم

Shahram1974
یک شنبه 10 تیر 1386, 20:38 عصر
مرسی آقای رضایی منش

من sp رو از تو خود database هم که اجرا می کنم همین مشکل رو دارم

whitehat
یک شنبه 10 تیر 1386, 22:00 عصر
باید شرط را بدین گونه بنویسید


(field1 LIKE @condition OR @condition IS NULL)

AminSobati
یک شنبه 10 تیر 1386, 23:56 عصر
http://www.sommarskog.se/dyn-search.html

Shahram1974
دوشنبه 11 تیر 1386, 13:50 عصر
white hat درست گفتی مرسی

AminSobati
دوشنبه 11 تیر 1386, 14:26 عصر
باید شرط را بدین گونه بنویسید


(field1 LIKE @condition OR @condition IS NULL)


این روش همیشه Table Scan میده، اگر Performance براتون مهمه طبق لینکی که پست کردم، از Dynamic TSQL استفاده کنین

majid_afra222
دوشنبه 11 تیر 1386, 19:40 عصر
این روش همیشه Table Scan میده، اگر Performance براتون مهمه طبق لینکی که پست کردم، از Dynamic TSQL استفاده کنین
سلام
برای جلوگیری از Table Scan شرط

(field1 LIKE @condition OR @condition IS NULL)رو به

(@condition IS NULL OR field1 LIKE @condition )
تبدیل کنید.

AminSobati
دوشنبه 11 تیر 1386, 20:55 عصر
سلام
برای جلوگیری از Table Scan شرط

(field1 LIKE @condition OR @condition IS NULL)رو به

(@condition IS NULL OR field1 LIKE @condition )
تبدیل کنید.

من همچنان Table Scan میگیرم!

majid_afra222
سه شنبه 12 تیر 1386, 12:32 عصر
سلام
من پرس و جوی زیر رو زدم و نتیجه این شد :

SET STATISTICS IO ON
declare @ADD_HUM_ID numeric(18)
--set @ADD_HUM_ID = 1
select ADD_HUM_ID, ADD_REL_ID, ADD_ADT_ID, ADD_CIT_ID, ADD_MAIN_STREET, ADD_DETOUR_STREET, ADD_ALLEY, ADD_POSTAL_CODE, ADD_EMAIL, ADD_UNIT, ADD_PLATE
from TBL_ADDRESS
where (@ADD_HUM_ID IS NULL OR ADD_HUM_ID IN (SELECT HUM_ID FROM TBL_HUMAN WHERE HUM_ID = @ADD_HUM_ID))
نتیجه :


(21 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'TBL_ADDRESS'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
ولی وفتی برای (@ADD_HUM_ID مقدار دادم :

(5 row(s) affected)
Table 'TBL_HUMAN'. Scan count 0, logical reads 42, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'TBL_ADDRESS'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

mahboob
سه شنبه 12 تیر 1386, 12:54 عصر
سلام
اینو امتحان کن

if @condition is null select * from table1
else select * from table1 where filed1 = @condition

majid_afra222
سه شنبه 12 تیر 1386, 18:28 عصر
سلام
اینو امتحان کن

if @condition is null select * from table1
else select * from table1 where filed1 = @condition
سلام
بحث چیز دیگه ای هستش، قبل از ارسال جواب یکبار مطالب رو بخونید.

AminSobati
سه شنبه 12 تیر 1386, 21:15 عصر
سلام
اینو امتحان کن

if @condition is null select * from table1
else select * from table1 where filed1 = @condition

اگر فقط یک شرط در Query داشته باشید این روش خوبه اما اگر فرضا 5 پارامتر در شرط داشته باشید تعداد if هایی که باید بنویسیم چندتا میشه؟! دو به توان پنج!

AminSobati
سه شنبه 12 تیر 1386, 21:19 عصر
سلام
من پرس و جوی زیر رو زدم و نتیجه این شد :

SET STATISTICS IO ON
declare @ADD_HUM_ID numeric(18)
--set @ADD_HUM_ID = 1
select ADD_HUM_ID, ADD_REL_ID, ADD_ADT_ID, ADD_CIT_ID, ADD_MAIN_STREET, ADD_DETOUR_STREET, ADD_ALLEY, ADD_POSTAL_CODE, ADD_EMAIL, ADD_UNIT, ADD_PLATE
from TBL_ADDRESS
where (@ADD_HUM_ID IS NULL OR ADD_HUM_ID IN (SELECT HUM_ID FROM TBL_HUMAN WHERE HUM_ID = @ADD_HUM_ID))
نتیجه :


(21 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'TBL_ADDRESS'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
ولی وفتی برای (@ADD_HUM_ID مقدار دادم :

(5 row(s) affected)
Table 'TBL_HUMAN'. Scan count 0, logical reads 42, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'TBL_ADDRESS'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

نتیجه Stat Profile دقیقتر نشون میده که چه اتفاقی داره میافته:


use northwind
go
set statistics profile on
go
declare @x int
set @x=10249
select * from [order details]
where @x is null or orderid = @x
go


نتیجه:
|--Clustered Index Scan(OBJECT:([Northwind].[dbo].[Order Details].[PK_Order_Details])



declare @x int
set @x=10249
select * from [order details]
where orderid = @x or @x is null
go


نتیجه:
|--Clustered Index Scan(OBJECT:([Northwind].[dbo].[Order Details].[PK_Order_Details])



declare @x int
set @x=10249
select * from [order details]
where orderid = @x
go


نتیجه:

|--Clustered Index Seek(OBJECT:([Northwind].[dbo].[Order Details].[PK_Order_Details])

mahboob
چهارشنبه 13 تیر 1386, 08:13 صبح
سلام
بحث چیز دیگه ای هستش، قبل از ارسال جواب یکبار مطالب رو بخونید.
جناب افرا با عرض پوزش از شما ولی من این پیغام رو در تاپیکی که sahram1974 با این عنوان " یا یک انتخاب یا همه در مقدار ورودی stored procedure پاسخ گویی به این تاپیک "شروع کرده گذاشتم ولی نمی دونم چرا از اینجا سرد در آورده قابل توجه مدیریت محترم سایت