PDA

View Full Version : ارسال شرط به صورت رشته از برنامه به پروسیجر



کم حوصله
سه شنبه 27 دی 1384, 09:29 صبح
با سلام
از پروسیجر ها جهت اعمال بعضی از سلکت ها استفاده می کنیم
حال باید گرینع به گرینه پارامترهای شرط را ارسال کنیم
اگر بخواهیم شرط را در برنامه ساخته و بعد به پروسیجر تحمیل کنیم چگونه می تونیم این کار را بکنیم
ضمنا یادآور شوم از طریق ساخت دستورات به صورت رشته ای نمی خواهم عمل کنم!!

S.Azish
سه شنبه 27 دی 1384, 16:46 عصر
CREATE PROCEDURE TESTPC
@Condition VARCHAR(500)

AS

SELECT * FROM TEST WHERE @Condition

AminSobati
سه شنبه 27 دی 1384, 22:09 عصر
با سلام
از پروسیجر ها جهت اعمال بعضی از سلکت ها استفاده می کنیم
حال باید گرینع به گرینه پارامترهای شرط را ارسال کنیم
اگر بخواهیم شرط را در برنامه ساخته و بعد به پروسیجر تحمیل کنیم چگونه می تونیم این کار را بکنیم
ضمنا یادآور شوم از طریق ساخت دستورات به صورت رشته ای نمی خواهم عمل کنم!!
دوست عزیزم در اکثر موارد، منطق این نیاز شما رو میشه به شکل زیر تغییر داد، امیدوارم مورد شما هم به این صورت حل بشه:


USE Northwind
GO

CREATE PROC usp_SearchCustomers
@P_Country NVARCHAR(100),
@P_City NVARCHAR(100)
AS
SELECT * FROM Customers WHERE
(Country=@P_Country OR @P_Country IS NULL)
AND
(City=@P_City OR @P_City IS NULL)
GO

EXEC usp_SearchCustomers 'UK','London'
EXEC usp_SearchCustomers NULL,'London'
EXEC usp_SearchCustomers 'UK',NULL
EXEC usp_SearchCustomers NULL,NULL

AminSobati
سه شنبه 27 دی 1384, 22:11 عصر
CREATE PROCEDURE TESTPC
@Condition VARCHAR(500)

AS

SELECT * FROM TEST WHERE @Condition

آقای آذیش این رو که احیانا جدی نگفتین!

S.Azish
چهارشنبه 28 دی 1384, 17:12 عصر
بله باید از Execute استفاده کرد, اشتباه منو ببخشید و ممنون بخاطر یادآوری :)
من هم روش شما رو پیشنهاد میکنم ولی گاهی اوقات و بدلیل پیچیدگی شرط ها استفاده از Execute ساده تر خواهد بود ولی مسلمآ stored procedure کندتر اجرا خواهد شد.




DECLARE @SQLSTATEMENT VARCHAR(550)
SET @SQLSTATEMENT = 'SELECT * FROM TEST WHERE ' + @Conition

EXECUTE (@SQLSTATEMENT)

Omid Rekabsaz
چهارشنبه 28 دی 1384, 20:05 عصر
من توی پروژه های مختلف از کد زیر که آقای ثباتی معرفی کرده اند خیلی استفاده کرده ام...


SELECT * FROM Customers WHERE
(Country=@P_Country OR @P_Country IS NULL)
AND
(City=@P_City OR @P_City IS NULL)

ولی بک ایرادی دارد و آن اینکه در حجم بالای اطلاعات استفاده از OR تاثیر منفی خیلی زیادی در سرعت دارد...
آقای ثباتی درست است یا خیر؟

AminSobati
پنج شنبه 29 دی 1384, 14:37 عصر
نه امید جان،
دلیل کندی، اغلب فقدان ایندکسهای صحیح هستش. من از این روش در Queryهای بسیار پیچیده با حجم اطلاعات بالا و تعداد کاربر همزمان بالا استفاده کردم و کوچکترین مشکلی نداشتیم

Elham_gh
دوشنبه 10 بهمن 1384, 22:10 عصر
من کد دیگری رو پشنهاد می کنم که از نظر سرعت هم عالی است:


USE Northwind
GO

CREATE PROC usp_SearchCustomers
@P_Country NVARCHAR(100)=’%’,
@P_City NVARCHAR(100)=’%’
AS
SELECT *
FROM Customers
WHERE
Country LIKE @P_Country
AND
City LIKE @P_City
GO

AminSobati
سه شنبه 11 بهمن 1384, 10:42 صبح
سلام،
روش مذکور در پست قبلی برای جستجو روی String مناسب هستش ولی بر روی اعداد، چون Like باعث Implicit Conversion روی اعداد میشه، لذا ایندکس به شکل ایده آل مورد استفاده قرار نمیگیره و Execution Plan دقیقا مشابه روش ... OR ...IS NULL بدست میاد. البته مشکلات دیگه ای هم داره مثلا مواقعی که فیلد شما Null اجازه میده و یا نوعش char باشه به جای varchar.
اگر دوستان مایل هستند یک مقاله مفصل در مورد جستجوهای Dynamic مطالعه کنند:
http://www.sommarskog.se/dyn-search.html
قطعا مفید خواهد بود.
موفق باشید

Elham_gh
سه شنبه 11 بهمن 1384, 11:21 صبح
این روشی است که در کتاب SQL Server 2000 Stored procedure & XML programming از انتشارات McGrawHill پیشنهاد شده و مسلما در مورد پارمترهای ورودی Char و VarChar صادق است نه اعداد.

spicirmkh
شنبه 23 آبان 1388, 09:49 صبح
اين دستور کارش چيه Country=@P_Country OR @P_Country IS NULL و حاصل چي برمي گردد



دوست عزیزم در اکثر موارد، منطق این نیاز شما رو میشه به شکل زیر تغییر داد، امیدوارم مورد شما هم به این صورت حل بشه:


USE Northwind
GO

CREATE PROC usp_SearchCustomers
@P_Country NVARCHAR(100),
@P_City NVARCHAR(100)
AS
SELECT * FROM Customers WHERE
(Country=@P_Country OR @P_Country IS NULL)
AND
(City=@P_City OR @P_City IS NULL)
GO

EXEC usp_SearchCustomers 'UK','London'
EXEC usp_SearchCustomers NULL,'London'
EXEC usp_SearchCustomers 'UK',NULL
EXEC usp_SearchCustomers NULL,NULL

DataMaster
شنبه 23 آبان 1388, 11:15 صبح
خیلی ساده
اگه پارامتر Null باشه Isnull مقدار True برمیگردونه
اگه پارامتر مقدار داشته باشه که اونم ممقدار صحیح میشه
بین دپاین دو تا هم OR شده یعنی اگه پارامتر مقدار داشته باشه شرط جستجو برقرار میشه و در صورتNull بودن پارامتر مقدار True بر میگردونه و شرط صرفا از نظر نحوی صحیح است


(با توجه به برداشت خودم)

AminSobati
شنبه 23 آبان 1388, 13:42 عصر
جا داره این نکته رو اشاره کنم که البته استفاده از روش OR باعث Table Scan میشه و سرعت مطلوب نخواهد بود. Dynamic TSQL نتیحه بهتری خواهد داشت

spicirmkh
یک شنبه 24 آبان 1388, 08:38 صبح
جا داره این نکته رو اشاره کنم که البته استفاده از روش OR باعث Table Scan میشه و سرعت مطلوب نخواهد بود. Dynamic TSQL نتیحه بهتری خواهد داشت

روش Dynamic TSQL به چه صورتي است ؟

سوال ديگر من اين است که
فرض کنيد nتا کلمه داريم مثل service webpage copied که اينجا 3 تا است و در textbox وارد کرده ايم

حال مي خواهيم اين 3 کلمه ترکيب and کنيم که اگر در جدول داخل فيلد title وجود داشت نشان دهد حال اينکه تعداد کلمات ورودي ما مشخص نيست

مثل
Open a web service with text that you've copied from a webpage