1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

(--(: ترفندهای SQL طور:)--!)

شروع موضوع توسط AftabGardoon ‏11/2/18 در انجمن SQL

  1. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    [​IMG]
     
    Shahab و DaniyaL از این پست تشکر کرده اند.
  2. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    مقايسه ركوردهاي دو جدول
    گاهي از اوقات يك سري از امكانات جديد در دسترس هستند اما فراموش مي‌شوند. براي مثال روش يافتن ركوردهاي غير يكسان دو جدول يكسان. مثلا يك ديتابيس قديمي داريد دقيقا مشابه ديتابيس كاري فعلي با همان ساختار (ري استور شده از يك بك آپ). اكنون مي‌خواهيد بدانيد در طول اين مدت چه ركوردهايي به ديتابيس كاري اضافه شده كه در ديتابيس قديمي ري استور شده موجود نيست و كلا كدام ركوردها با هم متفاوتند. چه بايد كرد؟

    مثال:
    دو جدول موقتي يكسان زير را در نظر بگيريد.
    کد:
      1. CREATE TABLE #tableA 
       2. (
       3. column1  INT,
       4. column2  INT
       5. )
       6.
       7. INSERT INTO #tableA
       8. VALUES
       9. (1,1)
      10. ,(1, 2)
      11. ,(1, 3)
      12. ,(2, 1)
      13.
      14. SELECT column1,
      15.      column2
      16. FROM   #tableA
      17.
      18. CREATE TABLE #tableB
      19. (
      20. column1  INT,
      21. column2  INT
      22. )
      23.
      24. INSERT INTO #tableB
      25. VALUES
      26. (1,1)
      27. ,(1, 3)
      28. ,(2, 2)
      29.   
      30. SELECT column1,
      31.      column2
      32. FROM   #tableB
    يك سري ديتاي دلخواه به آن‌ها اضافه شده است. (از روش اضافه كردن چندين ركورد توسط يك عبارت insert كه در اس كيوال سرور 2008 معرفي شده، استفاده گرديده است)
    کد:
    #tableA
    column1   column2
    -----------  -----------
    1               1
    1               2
    1               3
    2               1
    
    
    #tableB
    column1   column2
    -----------  -----------
    1              1
    1              3
    2              2
    اكنون مي‌خواهيم ركوردهايي از جدول A را كه در جدول B نيستند، پيدا كنيم. روش متداول انجام اين‌كار در اس كيوال سرور 2000 به صورت زير است:
    کد:
       1. SELECT column1, 
       2.      column2
       3. FROM   #tableA
       4. WHERE  NOT EXISTS (
       5.          SELECT *
       6.          FROM   #tableB
       7.          WHERE  #tableA.column1 = #tableB.column1
       8.                 AND #tableA.column2 = #tableB.column2
       9.      )
    کد:
    column1   column2
    -----------  -----------
    1               2
    2               1
    و يا روش زيباتر انجام اين‌كار كه از اس‌كيوال سرور 2005 به بعد معرفي شده، به صورت زير مي‌باشد:
    کد:
      1. SELECT column1, column2 FROM #tableA 
       2. EXCEPT
       3. SELECT column1, column2 FROM #tableB
    کد:
    column1   column2
    -----------  -----------
    1               2
    2               1
    Except ركوردهاي منحصربفردي از كوئري سمت چپ را كه در كوئري سمت راست وجود ندارند، بر مي‌گرداند.
    در اين حالت تعداد ستون‌هاي در نظر گرفته شده براي مقايسه بايد يكسان و يك نوع باشند.
    همچنين اگر مي‌خواهيد ركوردهايي از جدول A را كه در جدول B وجود دارند بيابيد، مي‌توان از intersect استفاده كرد.
     
    Shahab و DaniyaL از این پست تشکر کرده اند.
  3. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    کوئری های کاربردی!:))
    • کوئری 1: دریافت لیست کلیه بانک های اطلاعاتی
    این کوئری به شما کمک می کند که لیستی از بانک های موجود را دریافت کنید:
    کد:
    exec sp_helpdb
    • کوئری 2: نمایش متن یک Stored Procedure
    این کوئری دستوراتی که برای یک SP نوشته شده را در خروجی برای شما نمایش می دهد:
    کد:
    exec sp_helptext @objname = 'Object_Name'
    • کوئری 3: دریافت لیست کلیه Stored Procedure های مربوط به یک Database
    بوسیله کوئری زیر می توانید لیستی از Stored Procedure های تعریف شده برای یک بانک را بدست آورید:
    کد:
    USE [Database];
    go
    
    SELECT DISTINCT o.name, o.xtype   
    FROM syscomments c   
    INNER JOIN sysobjects o ON c.id=o.id   
    WHERE o.xtype='P' 
    به جای Database، نام بانک مورد نظر خود را بنویسید. همچنین برای دریافت لیست View ها می توانید به جای p در کوئری بالا، از کاراکتر v و برای بدست آوردن Function از fn استفاده کنید.
    • کوئری 4: دریافت لیست Stored Procedure های مربوط به یک Table
    بوسیله این کوئری می توان لیستی از Stored Procedure هایی که در آن از یک Table خاص استفاده شده را بدست آورد:
    کد:
    USE [Database];
    go
    
    SELECT DISTINCT o.name, o.xtype 
     
    FROM syscomments c 
     
    INNER JOIN sysobjects o ON c.id=o.id 
     
    WHERE c.TEXT LIKE '%Table_Name%' AND o.xtype='P'
    به جای Database نام بانک مورد نظر و به جای Table_Name نام جدول را بنویسید. همچنین برای دریافت لیست View ها می توانید به جای p در کوئری بالا، از کاراکتر v و برای بدست آوردن Function از fn استفاده کنید.
    • کوئری 5: Rebuild کردن همه Index های یک Database
    ایندکس های موجود در بانک های اطلاعاتی، به مرور زمان و با درج و حذف های متعدد، با پدیده ای به نام fragmentation مواجه می شوند. بوسیله Query زیر می توان ایندکس های یک بانک را بازسازی کرد:
    کد:
    USE [Database];
    GO
    
    EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)" 
    GO 
     
    EXEC sp_updatestats 
    GO 
    به جای Database نام بانک مورد نظر خود را بنویسید
     
    Shahab و DaniyaL از این پست تشکر کرده اند.
  4. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    برای مرتب کردن کوئری های SQL و نوشتن منظم و دندانه ای آنها میتوانید بدنه کوئری را در نرم افزار Visual Studio Code کپی کنید و افزونه Sql Beautify را بر روی آن نصب کنید و کدهایتان را با کلید میانبر alt+shift+f مرتب کنید.
     
    Shahab و DaniyaL از این پست تشکر کرده اند.
  5. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    چگونه از اسامی مستعار برای جداول و فیلدها در دستور SELECT اس کیو ال سرور استفاده کنیم؟
    یکی از کارهایی که برنامه نویسان اس کیو ال سرور مشتاق به آنند اینست که دستورات را خواناتر و کوتاه تر بنویسند. اسامی مستعار در این زمینه می توانند به شما کمک زیادی بکنند. مخصوصا در مواقعی که دستور SELECT شما از چندین جدول مختلف باشد و در آن از JOIN های زیادی استفاده شده باشد، این اسامی مستعار بسیار به کمک شما خواهند آمد. به دستور زیر دقت کنید :
    کد:
    SELECT WD.*
    ,P.RowName AS PersonName
    ,G.RowName AS GoodName
    FROM WhDocD WD
    LEFT JOIN Good G ON WD.Good_ID = G.RowID
    LEFT JOIN WhDocH WH ON WD.WhDocH_ID = WH.RowID
    LEFT JOIN Person P ON WH.Person_ID = P.RowID
    همانطور که می بینید در دستور سلکت بالا از اسامی مستعار برای جداول استفاده شده است.
    نکته : بطور کلی برای ایجاد یک اسم مستعار برای یک جدول یا یک فیلد می توانید بلافاصله بعد از نام آن جدول یا فیلد نام مستعار را قرار بدهید. اگر دقت کنید در دستور بالا بعد از نام فیلدها کلمه کلیدی AS را قرار داده ایم که برای نامگذاری مستعار کاربرد دارد. این کلمه کلیدی Optional می باشد و استفاده از آن ضروری نیست. اگر در قسمت جداول دقت کنید دیگر این کلمه کلیدی را قرار نداده ایم. با این حساب هر دو دستور زیر صحیح می باشند و اس کیو ال سرور به درستی آنرا اجرا خواهد کرد :
    کد:
    FROM WhDocD WD
    
    یا
    
    FROM WhDocD AS WD
    
     
    Shahab از این پست تشکر کرده است.
  6. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    چگونه اسامی فیلدهای یک جدول اس کیوال سرور را با دستور SELECT بدست بیاوریم؟
    گاهی اوقات لازم دارید تا فیلدهای یک جدول را در برنامه داشته باشید، بعنوان مثال ممکن است اسامی این فیلدها را برای عملیات مرتب سازی در اختیار کاربر قرار دهید. در اینگونه مواقع کار با متادیتاهای اس کیو ال سرور و جداول sys برای شما کاربردی خواهد بود. دستور زیر این کار را برای شما انجام می دهد.
    کد:
    SELECT *
    FROM sys.columns A
    WHERE A.object_id = OBJECT_ID('Table_1
    نکته : تابع OBJECT_ID نام یک جدول را می گیرد و آیدی آن را برمیگرداند. جدول sys.columns محلی است که کلیه فیلدهایی که در جداول یک پایگاه داده ایجاد می کنید در آن ذخیره می شوند و تفکیک این فیلدها نیز بر اساس آیدی جدول می باشد و فیلد مربوط به تفکیک نیز فیلد object_id می باشد. با دانستن این ارتباطات می توانید بسادگی با این جدول کار کنید.
     
    DaniyaL از این پست تشکر کرده است.
  7. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    چگونه اسامی جداول یک دیتابیس اس کیو ال سرور را با دستور سلکت استخراج کنیم؟
    گاهی اوقات پیش می آید که لازم دارید تا اسامی کلیه جداول یک پایگاه داده را داشته باشید. این مورد بیشتر در طراحی ابزارهای گزارش ساز پیشرفته در نرم افزارهای اتوماسیون اداری کاربرد پیدا می کند. به هر حال در هر موردی اگر صورت مساله شما این بود که چگونه اسامی جداول پایگاه داده را با یک SELECT استخراج کنید دستور زیر به شما کمک می کند.
    کد:
    SELECT *
    FROM sys.tables
    
    توضیح تکمیلی : بطور کلی اسکیمای sys شامل اطلاعات زیاد دیگر در مورد متادیتاهای اس کیو ال سرور می باشد که بد نیست مروری روی آن داشته باشید، تا در صورت لزوم بتوانید از آن بهره مند شوید.
     
    Shahab و DaniyaL از این پست تشکر کرده اند.
  8. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    چگونه در اس کیو ال سرور SELECT تو در تو بنویسیم؟
    یکی از مواردی که دانستن آن برای هر برنامه نویسی که با پایگاه داده اس کیو ال سرور سر و کار دارد ضرورت دارد، دانستن نحوه نوشتن سلکت های تو در تو می باشد. در ادامه چند نمونه سلکت تو در تو می نویسیم تا نمونه ای برای الگوبرداری در اختیار داشته باشید:
    نمونه اول :
    کد:
    SELECT V.*
    FROM
    (
    SELECT A.*
    FROM Table_1 A
    )V
    
    نمونه دوم :
    کد:
    SELECT V2.*
    FROM
    (
    SELECT V1.*
    FROM
    (
    SELECT A.*
    FROM Table_1 A
    )V1
    )V2
    
    همانطور که در نمونه ها دیدید محدودیتی در تعداد این سلکتهای تو در تو ندارید. مزیت این روش در اینست که ممکن است در هر سطح از سلکت محاسباتی را انجام بدهید که مبتنی بر سطح پایینی اش باشد. هر جا که در کد نویسی ضرورت دیدید می توانید از این سلکت های تو در تو استفاده نمایید.
     
    Shahab و DaniyaL از این پست تشکر کرده اند.
  9. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    چگونه لاگ فایل (LDF) اس کیو ال سرور را خالی کنیم؟ (حجمش را پایین بیاوریم)
    خیلی وقتها دیتابیس اس کیو ال سرور حجمش میره بالا و بعد از بررسی متوجه می شوید که حجم فایل اصلی یعنی فایل mdf بالا نرفته. در اینگونه مواقع اگر حجم فایل ldf بالا رفته باشه با استفاده از روش زیر می توانید حجم فایل ldf رو تا 1 مگابایت کاهش بدید.

    اولین کار اینه که یک بک آپ از دیتابیس اس کیوال سرور بگیرید. بعد دستور زیر رو اجرا کنید.

    کد:
    ALTER DATABASE @DBName SET RECOVERY SIMPLE WITH NO_WAIT
    DBCC SHRINKFILE(@DBName_log, 1)
    ALTER DATABASE @DBName SET RECOVERY FULL WITH NO_WAIT
    GO
     
    Shahab از این پست تشکر کرده است.
  10. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    ترفندهای ویژوعال استدیو طور در کد زدن SQL
    • کلیدهای [+Shift+Ctrl : انتخاب متن نوشته شده بین دو آکولاد ({})ترفند های ویژوال استدیو در کذ زنی عه SQL
    • کلیدهای [ + Ctrl : انتقال نشانگر از یک آکولاد باز ({) به آکولاد بسته (}). در واقع انتقال نشانگر از ابتدا به انتهای بلوک {}
    • کلیدهای [+Shift+Ctrl : انتخاب متن نوشته شده بین دو آکولاد ({})
    • کلیدهای Ctrl + Enter : ایجاد یک سطر خالی قبل از سطر جاری و انتقال نشانگر به ابتدای سطر خالی ایجاد شده
    • کلیدهای Ctrl + Shift + Enter : ایجاد یک سطر خالی بعد از سطر جاری و انتقال نشانگر به ابتدای سطر خالی ایجاد شده
    • کلیدهای Ctrl + Shift + Down و Ctrl + Shift + Up : در محیط کدنویسی Visual Studio 2013 زمانی که یک متغیر یا Reference انتخاب می شود تمامی مواردی آن متغیر یا Reference به کار رفته به صورت Highlight شده در می آید. جهت حرکت بین آیتم های Highlight شده می توانید از این کلیدها استفاده نمایید.
    • با استفاده از این گزینه شما می توانید در قسمت های مختلف منوها، گزینه ها، NuGetها جستجو نمایید. برای جستجوی عبارت در این قسمت پارامترهایی در نظر گرفته شده است که در زیر به شرح آن می پردازیم.
    1. MRU@ : چنانچه قبل از عبارت مورد جستجو این پارامتر نوشته شود آخرین ۵ گزینه استفاده شده منطبق با عبارت را نمایش خواهد داد. (Most Recently Used)
    2. MENU@ : چنانچه قبل از عبارت مورد جستجو این پارامتر نوشته شود جستجو فقط در منوهای محیط Visual Studio 2013 انجام خواهد شد. مثلا اگر بنویسیم menu option@
    3. OPT@ : چنانچه قبل از عبارت مورد جستجو این پارامتر نوشته شود جستجو داخل گزینه های هر قسمت انجام خواهد شد. مثلا اگر بنویسیم OPT intellitrace@
    4. DOC@ : چنانچه قبل از عبارت مورد جستجو این پارامتر نوشته شود جستجو داخل فایل های کد (cs) باز شده انجام خواهد شد.
    5. NUGET@ : چنانچه قبل از عبارت مورد جستجو این پارامتر نوشته شود جستجو داخل بسته های NuGet انجام خواهد شد.
    • کلیدهای Alt + Down و Alt + Up : جهت جابجا نمودن سطر جاری استفاده می شود.
    • Pascal Case : به مثال های زیر توجه کنید، همان گونه که ملاحظه می فرمایید اگر عبارت RK را بعد از Console تایپ نماییم، متد ReadKey برای ما نمایش داده خواهد شد. همچنین اگر WL تایپ نماییم WindowLeft و WriteLine جزء نتایج جستجو خواهد بود.

      نکته : برای جستجو در عبارت های PascalCase حتما باید از حروف بزرگ استفاده نمایید.
     
    Shahab و DaniyaL از این پست تشکر کرده اند.