نمایش نتایج 1 تا 14 از 14

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

  1. #1
    کاربر دائمی آواتار کم حوصله
    تاریخ عضویت
    مرداد 1382
    محل زندگی
    ایران - مشهد
    پست
    962

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

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

  2. #2

    CREATE PROCEDURE TESTPC
    @Condition VARCHAR(500)

    AS

    SELECT * FROM TEST WHERE @Condition

  3. #3
    نقل قول نوشته شده توسط کم حوصله
    با سلام
    از پروسیجر ها جهت اعمال بعضی از سلکت ها استفاده می کنیم
    حال باید گرینع به گرینه پارامترهای شرط را ارسال کنیم
    اگر بخواهیم شرط را در برنامه ساخته و بعد به پروسیجر تحمیل کنیم چگونه می تونیم این کار را بکنیم
    ضمنا یادآور شوم از طریق ساخت دستورات به صورت رشته ای نمی خواهم عمل کنم!!
    دوست عزیزم در اکثر موارد، منطق این نیاز شما رو میشه به شکل زیر تغییر داد، امیدوارم مورد شما هم به این صورت حل بشه:

    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

  4. #4
    نقل قول نوشته شده توسط S.Azish

    CREATE PROCEDURE TESTPC
    @Condition VARCHAR(500)

    AS

    SELECT * FROM TEST WHERE @Condition
    آقای آذیش این رو که احیانا جدی نگفتین!

  5. #5
    بله باید از Execute استفاده کرد, اشتباه منو ببخشید و ممنون بخاطر یادآوری :)
    من هم روش شما رو پیشنهاد میکنم ولی گاهی اوقات و بدلیل پیچیدگی شرط ها استفاده از Execute ساده تر خواهد بود ولی مسلمآ stored procedure کندتر اجرا خواهد شد.



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

    EXECUTE (@SQLSTATEMENT)


  6. #6
    من توی پروژه های مختلف از کد زیر که آقای ثباتی معرفی کرده اند خیلی استفاده کرده ام...

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

    ولی بک ایرادی دارد و آن اینکه در حجم بالای اطلاعات استفاده از OR تاثیر منفی خیلی زیادی در سرعت دارد...
    آقای ثباتی درست است یا خیر؟
    آخرین ویرایش به وسیله Omid Rekabsaz : چهارشنبه 28 دی 1384 در 20:10 عصر

  7. #7
    نه امید جان،
    دلیل کندی، اغلب فقدان ایندکسهای صحیح هستش. من از این روش در Queryهای بسیار پیچیده با حجم اطلاعات بالا و تعداد کاربر همزمان بالا استفاده کردم و کوچکترین مشکلی نداشتیم

  8. #8
    کاربر دائمی آواتار Elham_gh
    تاریخ عضویت
    بهمن 1384
    محل زندگی
    Tehran
    سن
    48
    پست
    718
    من کد دیگری رو پشنهاد می کنم که از نظر سرعت هم عالی است:

    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


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

  10. #10
    کاربر دائمی آواتار Elham_gh
    تاریخ عضویت
    بهمن 1384
    محل زندگی
    Tehran
    سن
    48
    پست
    718
    این روشی است که در کتاب SQL Server 2000 Stored procedure & XML programming از انتشارات McGrawHill پیشنهاد شده و مسلما در مورد پارمترهای ورودی Char و VarChar صادق است نه اعداد.

  11. #11
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    Iran
    پست
    1,035

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

    اين دستور کارش چيه Country=@P_Country OR @P_Country IS NULL و حاصل چي برمي گردد


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

    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

  12. #12
    کاربر دائمی آواتار DataMaster
    تاریخ عضویت
    تیر 1382
    محل زندگی
    مشهد الرضا
    پست
    634

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

    خیلی ساده
    اگه پارامتر Null باشه Isnull مقدار True برمیگردونه
    اگه پارامتر مقدار داشته باشه که اونم ممقدار صحیح میشه
    بین دپاین دو تا هم OR شده یعنی اگه پارامتر مقدار داشته باشه شرط جستجو برقرار میشه و در صورتNull بودن پارامتر مقدار True بر میگردونه و شرط صرفا از نظر نحوی صحیح است


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

  13. #13

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

    جا داره این نکته رو اشاره کنم که البته استفاده از روش OR باعث Table Scan میشه و سرعت مطلوب نخواهد بود. Dynamic TSQL نتیحه بهتری خواهد داشت

  14. #14
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    Iran
    پست
    1,035

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

    نقل قول نوشته شده توسط AminSobati مشاهده تاپیک
    جا داره این نکته رو اشاره کنم که البته استفاده از روش 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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •