sql server - एसक्यूएल सर्वर की छिपी हुई विशेषताएं




sql-server tsql (20)

SELECT क्वेरी परिणाम में पंक्ति संख्या दिखाने के लिए SQL Server 2005/2008 में:

SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
        GrandTotal, CustomerId, PurchaseDate
FROM Orders

आदेश एक अनिवार्य खंड है। ओवर () क्लॉज एसक्यूएल इंजन को निर्दिष्ट कॉलम पर डेटा सॉर्ट करने के लिए बताता है (इस मामले में ऑर्डरआईडी) और सॉर्ट परिणामों के अनुसार संख्याएं असाइन करें।

SQL सर्वर की कुछ छिपी हुई विशेषताएं क्या हैं?

उदाहरण के लिए, अनियंत्रित सिस्टम संग्रहीत प्रक्रियाओं, चीजों को करने के लिए चालें जो बहुत उपयोगी हैं लेकिन पर्याप्त दस्तावेज नहीं हैं?

जवाब

सभी महान उत्तरों के लिए सभी को धन्यवाद!

संग्रहित प्रक्रियाएं

  • sp_msforeachtable: '?' के साथ एक कमांड चलाता है प्रत्येक तालिका नाम के साथ प्रतिस्थापित (v6.5 और ऊपर)
  • sp_msforeachdb: '?' के साथ एक कमांड चलाता है प्रत्येक डेटाबेस नाम (v7 और ऊपर) के साथ प्रतिस्थापित
  • sp_who2: बस sp_who की तरह, लेकिन समस्या निवारण ब्लॉक (v7 और ऊपर) के लिए बहुत अधिक जानकारी के साथ
  • sp_helptext: यदि आप संग्रहीत प्रक्रिया का कोड चाहते हैं, तो देखें और यूडीएफ
  • sp_tables: स्कोप में सभी तालिकाओं और डेटाबेस के विचारों की एक सूची लौटाएं
  • sp_stored_procedures: सभी संग्रहीत प्रक्रियाओं की एक सूची वापस करें
  • xp_sscanf: प्रत्येक प्रारूप तर्क द्वारा निर्दिष्ट तर्क स्थानों में स्ट्रिंग से डेटा पढ़ता है।
  • xp_fixeddrives:: सबसे बड़ी खाली जगह के साथ निश्चित ड्राइव खोजें
  • sp_help: यदि आप टेबल संरचना, इंडेक्स और किसी तालिका की बाधाओं को जानना चाहते हैं। विचार और यूडीएफ भी। शॉर्टकट Alt + F1 है

स्निपेट्स

  • यादृच्छिक क्रम में पंक्तियों को वापस करना
  • अंतिम संशोधित तिथि से सभी डेटाबेस उपयोगकर्ता ऑब्जेक्ट्स
  • केवल वापसी की तारीख
  • रिकॉर्ड्स खोजें जो वर्तमान सप्ताह के अंदर कहीं भी गिरती है।
  • पिछले हफ्ते हुई तारीखों को खोजें।
  • वर्तमान सप्ताह की शुरुआत के लिए तारीख लौटाता है।
  • पिछले सप्ताह की शुरुआत के लिए तारीख लौटाता है।
  • एक सर्वर के लिए तैनात एक प्रक्रिया का पाठ देखें
  • डेटाबेस से सभी कनेक्शन ड्रॉप करें
  • टेबल चेकसम
  • पंक्ति चेकसम
  • डेटाबेस में सभी प्रक्रियाओं को छोड़ दें
  • पुनर्स्थापित करने के बाद लॉगिन आईडी सही तरीके से दोबारा मानचित्र करें
  • एक INSERT कथन से संग्रहीत प्रक्रियाओं को कॉल करें
  • कीवर्ड द्वारा प्रक्रियाएं पाएं
  • डेटाबेस में सभी प्रक्रियाओं को छोड़ दें
  • प्रोग्रामिंग के लिए डेटाबेस के लिए लेनदेन लॉग पूछें।

कार्य

  • HashBytes ()
  • EncryptByKey
  • PIVOT कमांड

विविध

  • कनेक्शन स्ट्रिंग अतिरिक्त
  • TableDiff.exe
  • लॉगऑन घटनाओं के लिए ट्रिगर्स (सर्विस पैक 2 में नया)
  • निरंतर-गणना-कॉलम (पीसीसी) के साथ प्रदर्शन को बढ़ावा देना।
  • Sys.database_principles में DEFAULT_SCHEMA सेटिंग
  • जबरन पैरामीटरेशन
  • वर्डसीमल स्टोरेज प्रारूप
  • सेकंड में सबसे लोकप्रिय प्रश्नों का पता लगाना
  • स्केलेबल साझा डेटाबेस
  • SQL प्रबंधन स्टूडियो में तालिका / संग्रहीत प्रक्रिया फ़िल्टर सुविधा
  • ट्रेस झंडे
  • एक GO बाद संख्या बैच दोहराता है
  • स्कीमा का उपयोग कर सुरक्षा
  • एन्क्रिप्शन कार्यों, विचारों और ट्रिगर्स के साथ बेस टेबल में निर्मित एन्क्रिप्शन

SQL सर्वर डेवलपर्स के बहुत सारे अभी भी DELETE, INSERT और UPDATE कथन पर OUTPUT खंड (SQL Server 2005 और नए) के बारे में नहीं जानते हैं।

यह जानना बेहद उपयोगी हो सकता है कि कौन सी पंक्तियां INSERTed, UPDATED, या DELETED की गई हैं, और OUTPUT क्लॉज इसे बहुत आसानी से करने की अनुमति देता है - यह "वर्चुअल" टेबल तक पहुंच की अनुमति देता है जिसे inserted और deleted inserted deleted (जैसे ट्रिगर में):

DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)

यदि आप किसी तालिका में मान डाल रहे हैं जिसमें OUTPUT क्लॉज के साथ एक आईएनटी पहचान प्राथमिक कुंजी फ़ील्ड है, तो आप तुरंत डाली गई नई आईडी प्राप्त कर सकते हैं:

INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)

और यदि आप अपडेट कर रहे हैं, तो यह जानना बेहद उपयोगी हो सकता है कि क्या बदल गया - इस मामले में, inserted नए मानों (अद्यतन के बाद) का प्रतिनिधित्व करता है, जबकि deleted अद्यतन से पहले पुराने मानों को संदर्भित करता है:

UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)

यदि बहुत सारी जानकारी लौटा दी जाएगी, तो OUTPUT के आउटपुट को अस्थायी तालिका या तालिका चर ( OUTPUT INTO @myInfoTable ) पर रीडायरेक्ट किया जा सकता है।

बेहद उपयोगी - और बहुत कम ज्ञात!

न घुलनेवाली तलछट


एक संग्रहित प्रक्रिया चाल यह है कि आप उन्हें एक INSERT कथन से कॉल कर सकते हैं। जब मैं SQL सर्वर डेटाबेस पर काम कर रहा था तो मुझे यह बहुत उपयोगी पाया।

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto

ऐसे समय होते हैं जब सॉर्ट करने के लिए कोई उपयुक्त कॉलम नहीं होता है, या आप किसी तालिका पर डिफ़ॉल्ट सॉर्ट ऑर्डर चाहते हैं और आप प्रत्येक पंक्ति को गिनना चाहते हैं। ऐसा करने के लिए आप "ऑर्डर बाय" खंड में "(चयन 1)" डाल सकते हैं और आप जो चाहते हैं उसे प्राप्त करेंगे। साफ, आह?

select row_number() over (order by (select 1)), * from dbo.Table as t

केवल वापसी की तारीख

Select Cast(Floor(Cast(Getdate() As Float))As Datetime)

या

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))

टेबल चेकसम

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)

पंक्ति चेकसम

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value

परीक्षण उद्देश्यों या जो भी हो, के लिए डेटाबेस को बहाल करते समय उपयोगी। लॉगिन आईडी को सही तरीके से दोबारा मानचित्रित करें:

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'

प्रबंधन स्टूडियो में, आप तालिका के लिए कॉलम की कॉमा-सीमांकित सूची को तुरंत प्राप्त कर सकते हैं:

  1. ऑब्जेक्ट एक्सप्लोरर में, किसी दिए गए तालिका के नीचे नोड्स का विस्तार करें (ताकि आप कॉलम, कुंजी, बाधाओं, ट्रिगर्स इत्यादि के लिए फ़ोल्डर देखेंगे)
  2. कॉलम फ़ोल्डर को इंगित करें और एक क्वेरी में खींचें।

यह आसान है जब आप टेबल पर राइट-क्लिक करके और स्क्रिप्ट टेबल को चुनकर लौटकर हेनस प्रारूप का उपयोग नहीं करना चाहते हैं ..., फिर सम्मिलित करें ... यह चाल अन्य फ़ोल्डर्स के साथ काम करती है जिसमें यह आपको देगा फ़ोल्डर में निहित नामों की एक अल्पविराम-सीमित सूची।


मुझे पता है कि यह बिल्कुल छुपा नहीं है, लेकिन बहुत से लोग PIVOT कमांड के बारे में नहीं जानते हैं। मैं एक संग्रहीत प्रक्रिया को बदलने में सक्षम था जो कर्सर का इस्तेमाल करता था और कोड के तेज़ 6 सेकंड टुकड़े में चलाने के लिए 2 मिनट लगते थे जो लाइनों की संख्या दसवीं थी!


मुझे यकीन नहीं है कि यह एक छिपी हुई विशेषता है या नहीं, लेकिन मैं इस पर ठोकर खाई, और कई मौकों पर इसे उपयोगी पाया है। आप एक कथन का उपयोग करने और चयन कथन के माध्यम से लूपिंग के बजाय, एक ही चयन कथन में किसी फ़ील्ड के सेट को जोड़ सकते हैं।

उदाहरण:

DECLARE @nvcConcatonated nvarchar(max)
SET @nvcConcatonated = ''

SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', '
FROM tblCompany C
WHERE C.CompanyID IN (1,2,3)

SELECT @nvcConcatonated

परिणाम:

Acme, Microsoft, Apple,

यदि आप टेबल संरचना, अनुक्रमणिका और बाधाओं को जानना चाहते हैं:

sp_help 'TableName'

यदि आप संग्रहीत प्रक्रिया का कोड चाहते हैं तो आप यह कर सकते हैं:

sp_helptext 'ProcedureName'

(सुनिश्चित नहीं है कि यह छिपी हुई विशेषता है, लेकिन मैं इसे हर समय उपयोग करता हूं)


यादृच्छिक क्रम में पंक्तियों को वापस करने के लिए एक कम ज्ञात टीएसक्यूएल तकनीक:

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())

रिकॉर्ड्स खोजें जो वर्तमान सप्ताह के अंदर कहीं भी गिरती है।

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )

पिछले हफ्ते हुई तारीखों को खोजें।

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

वर्तमान सप्ताह की शुरुआत के लिए तारीख लौटाता है।

select dateadd( week, datediff( week, 0, getdate() ), 0 )

पिछले सप्ताह की शुरुआत के लिए तारीख लौटाता है।

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )


EncryptByKey साथ सरल एन्क्रिप्शन


sp_msforeachtable : '?' के साथ एक कमांड चलाता है प्रत्येक तालिका नाम के साथ बदल दिया। जैसे

exec sp_msforeachtable "dbcc dbreindex('?')"

आप प्रत्येक तालिका के लिए 3 कमांड जारी कर सकते हैं

exec sp_msforeachtable
    @Command1 = 'print ''reindexing table ?''',
    @Command2 = 'dbcc dbreindex(''?'')',
    @Command3 = 'select count (*) [?] from ?'

इसके अलावा, sp_MSforeachdb


अतिरिक्त और अंतर

विस्तृत जॉइन और सबक्विरीज़ लिखने के बजाय, ये दो कीवर्ड दो क्वेरी परिणामों की तुलना करते समय आपकी क्वेरी के इरादे को व्यक्त करने के एक और अधिक सुरुचिपूर्ण शॉर्टेंड और पठनीय तरीके हैं। एसक्यूएल सर्वर 2005 के रूप में नया, वे दृढ़ता से यूनियन का पूरक हैं जो वर्षों से टीएसक्यूएल भाषा में पहले से मौजूद है।

एक्सेप्ट, इंटरसेक्ट, और यूनियन की अवधारणा सेट सिद्धांत में मौलिक हैं जो सभी आधुनिक आरडीबीएमएस द्वारा उपयोग किए जाने वाले संबंधपरक मॉडलिंग के आधार और आधार के रूप में कार्य करती है। अब, वेन आरेख प्रकार के परिणाम अधिक सहजता से और टीएसक्यूएल का उपयोग करके आसानी से उत्पन्न हो सकते हैं।


कायम-परिकलित-स्तंभ

  • गणना किए गए कॉलम आपको रनटाइम गणना लागत को डेटा संशोधन चरण में स्थानांतरित करने में मदद कर सकते हैं। गणना कॉलम शेष पंक्ति के साथ संग्रहीत किया जाता है और जब गणना की गई कॉलम और क्वेरी मिलान पर अभिव्यक्ति होती है तो पारदर्शी रूप से उपयोग किया जाता है। आप अभिव्यक्ति पर फ़िल्टर और रेंज स्कैन को तेज करने के लिए पीसीसी पर इंडेक्स भी बना सकते हैं।

Link


पंक्ति रचनाकारों

आप एक ही सम्मिलन कथन के साथ डेटा की कई पंक्तियां डाल सकते हैं।

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')





tsql