Microsoft SQL ServerMicrosoft SQL सर्वर के साथ प्रारंभ करना


टिप्पणियों

यह SQL सर्वर के मूल उपयोग को उजागर करने वाले उदाहरणों का एक समूह है।

संस्करण

संस्करण रिलीज़ की तारीख
SQL सर्वर 2016 2016/06/01
SQL सर्वर 2014 2014-03-18
SQL सर्वर 2012 2011-10-11
SQL सर्वर 2008 R2 2010-04-01
SQL सर्वर 2008 2008-08-06
SQL सर्वर 2005 2005/11/01
SQL सर्वर 2000 2000/11/01

कोड में टिप्पणियाँ

Transact-SQL टिप्पणी लेखन के दो रूपों का समर्थन करता है। डेटाबेस इंजन द्वारा टिप्पणियों को अनदेखा किया जाता है, और लोगों को पढ़ने के लिए होता है।

टिप्पणियां पूर्ववर्ती हैं -- और तब तक नज़रअंदाज़ किया जाता है जब तक कि एक नई लाइन सामने नहीं आती है:

-- This is a comment
SELECT *
FROM MyTable -- This is another comment
WHERE Id = 1;
 

स्लैश स्टार टिप्पणियाँ /* साथ शुरू होती हैं और */ साथ समाप्त होती हैं। उन सीमांकक के बीच सभी पाठ को एक टिप्पणी ब्लॉक माना जाता है।

/* This is
a multi-line
comment block. */
SELECT Id = 1, [Message] = 'First row'
UNION ALL
SELECT 2, 'Second row'
/* This is a one liner */
SELECT 'More';
 

स्लैश स्टार टिप्पणियों में टिप्पणी को उपयोगी रखने का लाभ होता है यदि SQL स्टेटमेंट नई लाइन वर्ण खो देता है। यह तब हो सकता है जब समस्या निवारण के दौरान SQL कैप्चर किया जाता है।

स्लैश स्टार टिप्पणियों को नेस्ट किया जा सकता है और स्लैश स्टार टिप्पणी के अंदर एक शुरुआत /* को वैध होने के लिए */ साथ समाप्त किया जाना चाहिए। निम्न कोड के परिणामस्वरूप त्रुटि होगी

/*
SELECT *
FROM CommentTable
WHERE Comment = '/*'
*/
 

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

/*
SELECT *
FROM CommentTable
WHERE Comment = '/*'
*/  */
 

नई तालिका बनाएं और पुरानी तालिका से रिकॉर्ड डालें

SELECT * INTO NewTable FROM OldTable
 

पुरानी तालिका की संरचना के साथ एक नई तालिका बनाता है और सभी पंक्तियों को नई तालिका में सम्मिलित करता है।

कुछ प्रतिबंध

  1. आप नई तालिका के रूप में तालिका चर या तालिका-मूल्यवान पैरामीटर निर्दिष्ट नहीं कर सकते।
  2. आप विभाजन तालिका बनाने के लिए SELECT… INTO का उपयोग नहीं कर सकते, तब भी जब स्रोत तालिका विभाजित हो। चयन करें ... INTO स्रोत तालिका की विभाजन योजना का उपयोग नहीं करता है; इसके बजाय, नई फ़ाइल डिफ़ॉल्ट फ़ाइल समूह में बनाई गई है। विभाजन तालिका में पंक्तियाँ सम्मिलित करने के लिए, आपको पहले विभाजन तालिका बनाना होगा और फिर INSERT INTO ... चयन कथन का उपयोग करना होगा।
  3. स्रोत तालिका में परिभाषित इंडेक्स, बाधाएं और ट्रिगर नई तालिका में स्थानांतरित नहीं होते हैं, न ही उन्हें SELECT ... INTO कथन में निर्दिष्ट किया जा सकता है। यदि इन ऑब्जेक्ट्स की आवश्यकता होती है, तो आप SELECT ... INTO स्टेटमेंट निष्पादित करने के बाद उन्हें बना सकते हैं।
  4. आदेश द्वारा आदेश निर्दिष्ट करना पंक्तियों को निर्दिष्ट क्रम में सम्मिलित किए जाने की गारंटी नहीं देता है। जब एक स्पार्स कॉलम का चयन सूची में किया जाता है, तो स्पार्स कॉलम की संपत्ति नए टेबल में कॉलम में स्थानांतरित नहीं होती है। यदि नई तालिका में यह गुण आवश्यक है, तो इस संपत्ति को शामिल करने के लिए SELECT ... INTO कथन को निष्पादित करने के बाद कॉलम की परिभाषा को बदल दें।
  5. जब एक गणना किए गए कॉलम को चयन सूची में शामिल किया जाता है, तो नई तालिका में संबंधित कॉलम एक गणना कॉलम नहीं होता है। नए कॉलम में दिए गए मान उन मूल्यों को कहते हैं, जिनका चयन SELECT ... INTO के समय हुआ था।

[ sic ]

DELETE सभी पंक्तियाँ

DELETE
FROM Helloworlds
 

यह तालिका से सभी डेटा को हटा देगा। इस कोड को चलाने के बाद तालिका में कोई पंक्तियाँ नहीं होंगी। DROP TABLE विपरीत, यह तालिका और इसकी संरचना को संरक्षित करता है और आप उस तालिका में नई पंक्तियाँ डालना जारी रख सकते हैं।

तालिका में सभी पंक्तियों को हटाने का एक और तरीका है, इसे निम्नानुसार काटें:

TRUNCATE TABLE HelloWords
 

DELETE ऑपरेशन के साथ अंतर कई हैं:

  1. Truncate कार्रवाई हस्तांतरण लॉग फ़ाइल में संग्रहीत नहीं है
  2. यदि IDENTITY क्षेत्र मौजूद है, तो इसे रीसेट कर दिया जाएगा
  3. TRUNCATE को पूरी तालिका पर लागू किया जा सकता है और इसकी ओर से कोई भी (इसके बजाय DELETE कमांड से आप WHERE क्लॉज़ को जोड़ सकते हैं)

TRUNCATE के प्रतिबंध

  1. यदि कोई FOREIGN KEY संदर्भ है, तो किसी तालिका को चिह्नित नहीं कर सकता
  2. यदि तालिका एक INDEXED VIEW में भाग INDEXED VIEW
  3. यदि तालिका को TRANSACTIONAL REPLICATION या MERGE REPLICATION का उपयोग करके प्रकाशित किया जाता है
  4. यह तालिका में परिभाषित किसी भी TRIGGER को आग नहीं देगा

[वैसा]

टेबल रो काउंट प्राप्त करना

निम्न उदाहरण का उपयोग किसी डेटाबेस में किसी विशिष्ट तालिका के लिए कुल पंक्ति गणना खोजने के लिए किया जा सकता है, यदि table_name को उस तालिका से प्रतिस्थापित किया जाता है जिसे आप क्वेरी करना चाहते हैं:

SELECT COUNT(*) AS [TotalRowCount] FROM table_name;
 

निम्नलिखित स्क्रिप्ट का उपयोग करके तालिका के HEAP (index_id = 0) या क्लस्टर क्लस्टर इंडेक्स (index_id = 1) के आधार पर तालिका के विभाजन में वापस जुड़कर सभी तालिकाओं के लिए पंक्ति गणना प्राप्त करना भी संभव है:

SELECT  [Tables].name                AS [TableName],
        SUM( [Partitions].[rows] )    AS [TotalRowCount]
FROM    sys.tables AS [Tables]
JOIN    sys.partitions AS [Partitions]
    ON  [Tables].[object_id]    =    [Partitions].[object_id]
    AND [Partitions].index_id IN ( 0, 1 )
--WHERE    [Tables].name = N'table name' /* uncomment to look for a specific table */
GROUP BY    [Tables].name;
 

यह संभव है क्योंकि प्रत्येक तालिका अनिवार्य रूप से एकल विभाजन तालिका है, जब तक कि इसमें अतिरिक्त विभाजन नहीं जोड़े जाते। इस स्क्रिप्ट में टेबल पंक्तियों को पढ़ने / लिखने के संचालन में हस्तक्षेप न करने का भी लाभ है।

INSERT / SELECT / UPDATE / DELETE: डेटा मैनिपुलेशन भाषा की मूल बातें

डी अटा एम एलीप्यूलेशन एल एनगेज (शॉर्ट के लिए डीएमएल) में INSERT , UPDATE और DELETE जैसे ऑपरेशन शामिल हैं:

-- Create a table HelloWorld

CREATE TABLE HelloWorld (
    Id INT IDENTITY,
    Description VARCHAR(1000)
)


-- DML Operation INSERT, inserting a row into the table
INSERT INTO HelloWorld (Description) VALUES ('Hello World')


-- DML Operation SELECT, displaying the table 
SELECT * FROM HelloWorld  


-- Select a specific column from table
SELECT Description FROM HelloWorld


-- Display number of records in the table
SELECT Count(*) FROM HelloWorld


-- DML Operation UPDATE, updating a specific row in the table
UPDATE HelloWorld SET Description = 'Hello, World!' WHERE Id = 1


-- Selecting rows from the table (see how the Description has changed after the update?)
SELECT * FROM HelloWorld


-- DML Operation - DELETE, deleting a row from the table
DELETE FROM HelloWorld WHERE Id = 1


-- Selecting the table. See table content after DELETE operation 
SELECT * FROM HelloWorld
 

इस स्क्रिप्ट में हम कुछ बुनियादी प्रश्नों को प्रदर्शित करने के लिए एक तालिका बना रहे हैं।

निम्न उदाहरण दिखा रहे हैं कि कैसे टेबल को क्वेरी करें:

USE Northwind;
GO
SELECT TOP 10 * FROM Customers 
ORDER BY CompanyName
 

स्तंभ Northwind (जो Microsoft के नमूना डेटाबेस में से एक है, से स्तंभ CompanyName द्वारा आदेशित Customer तालिका के पहले 10 रिकॉर्ड का चयन करेगा, इसे यहां से डाउनलोड किया जा सकता है ):

नॉर्थविंड डेटाबेस क्वेरी

ध्यान दें कि Use Northwind; बाद के सभी प्रश्नों के लिए डिफ़ॉल्ट डेटाबेस में बदलाव करता है। आप अभी भी [डेटाबेस] [स्कीमा] [तालिका] के रूप में पूरी तरह से योग्य वाक्यविन्यास का उपयोग करके डेटाबेस का संदर्भ दे सकते हैं।

SELECT TOP 10 * FROM Northwind.dbo.Customers 
ORDER BY CompanyName

SELECT TOP 10 * FROM Pubs.dbo.Authors
ORDER BY City
 

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

यदि डेटाबेस टेबल में कॉलम होते हैं, जिन्हें आरक्षित शब्दों की तरह नाम दिया जाता है, जैसे Date , तो आपको कोष्ठक में कॉलम नाम संलग्न करना होगा, जैसे:

-- descending order
SELECT TOP 10 [Date] FROM dbo.MyLogTable
ORDER BY [Date] DESC
 

यदि स्तंभ नाम में इसके नाम में रिक्त स्थान हैं (जो अनुशंसित नहीं है) तो वही लागू होता है। एक वैकल्पिक वाक्यविन्यास वर्ग कोष्ठक के बजाय दोहरे उद्धरण चिह्नों का उपयोग करना है, जैसे:

-- descending order
SELECT top 10 "Date" from dbo.MyLogTable
order by "Date" desc 
 

समतुल्य है लेकिन आमतौर पर इसका उपयोग नहीं किया जाता है। दोहरे उद्धरण चिह्नों और एकल उद्धरणों के बीच अंतर पर ध्यान दें: एकल उद्धरण स्ट्रिंग के लिए उपयोग किए जाते हैं, अर्थात

-- descending order
SELECT top 10 "Date" from dbo.MyLogTable
where UserId='johndoe'
order by "Date" desc 
 

एक मान्य सिंटैक्स है। ध्यान दें कि T-SQL में NChar और NVarchar डेटा प्रकारों के लिए एक N उपसर्ग है, उदा

SELECT TOP 10 * FROM Northwind.dbo.Customers 
WHERE CompanyName LIKE N'AL%'
ORDER BY CompanyName
 

AL ( % एक वाइल्ड कार्ड है) के साथ शुरू होने वाली कंपनी का नाम रखने वाली सभी कंपनियों को इसका उपयोग करें, जैसा कि आप एक डॉस कमांड लाइन में तारांकन का उपयोग करेंगे, जैसे कि DIR AL* )। LIKE , वाइल्डकार्ड्स की एक जोड़ी उपलब्ध है, अधिक विवरण जानने के लिए यहाँ देखें।

में शामिल

यदि आप उन फ़ील्ड्स को क्वेरी करना चाहते हैं जो एक एकल तालिका में मौजूद नहीं हैं, लेकिन कई तालिकाओं में शामिल होने के लिए जॉइन उपयोगी हैं। उदाहरण के लिए: आप Northwind डेटाबेस में Region तालिका से सभी स्तंभों को क्वेरी करना चाहते हैं। लेकिन आप नोटिस करते हैं कि आपको RegionDescription की भी आवश्यकता होती है, जिसे एक अलग टेबल, Region में स्टोर किया जाता है। हालाँकि, एक सामान्य कुंजी है, RgionID जिसका उपयोग आप इस जानकारी को एक ही क्वेरी में संयोजित करने के लिए कर सकते हैं ( Top 5 केवल पहली 5 पंक्तियाँ लौटाता है, सभी पंक्तियों को प्राप्त करने के लिए इसे छोड़ दें):

SELECT TOP 5 Territories.*, 
    Regions.RegionDescription 
FROM Territories 
INNER JOIN Region 
    ON Territories.RegionID=Region.RegionID
ORDER BY TerritoryDescription
 

से सभी स्तंभों को दिखा देंगे Territories प्लस RegionDescription से स्तंभ Region । परिणाम TerritoryDescription द्वारा आदेश दिया गया है।

टेबल उपनाम

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

<TableName> [as] <alias>
 

कहाँ as एक वैकल्पिक कीवर्ड है। उदाहरण के लिए, पिछली क्वेरी को फिर से लिखा जा सकता है:

SELECT TOP 5 t.*, 
    r.RegionDescription 
FROM Territories t
INNER JOIN Region r 
    ON t.RegionID = r.RegionID
ORDER BY TerritoryDescription
 

क्वेरी में सभी तालिकाओं के लिए उपनाम अद्वितीय होना चाहिए, भले ही आप एक ही तालिका का दो बार उपयोग करें। उदाहरण के लिए, यदि आपकी कर्मचारी तालिका में एक पर्यवेक्षक शामिल है, तो आप इस क्वेरी का उपयोग किसी कर्मचारी और उसके पर्यवेक्षक का नाम वापस करने के लिए कर सकते हैं:

SELECT e.*, 
    s.Name as SupervisorName -- Rename the field for output
FROM Employee e
INNER JOIN Employee s
    ON e.SupervisorId = s.EmployeeId
WHERE e.EmployeeId = 111
 

यूनियन

जैसा कि हमने पहले देखा है, एक जॉइन विभिन्न टेबल स्रोतों से कॉलम जोड़ता है। लेकिन क्या होगा अगर आप विभिन्न स्रोतों से पंक्तियों को जोड़ना चाहते हैं? इस स्थिति में आप UNION का उपयोग कर सकते हैं। मान लीजिए आप एक पार्टी की योजना बना रहे हैं और न केवल कर्मचारियों बल्कि ग्राहकों को भी आमंत्रित करना चाहते हैं। तब आप इसे करने के लिए इस क्वेरी को चला सकते हैं:

SELECT FirstName+' '+LastName as ContactName, Address, City FROM Employees
UNION
SELECT ContactName, Address, City FROM Customers
 

यह कर्मचारियों और ग्राहकों से एक ही तालिका में नाम, पते और शहर लौटाएगा। ध्यान दें कि डुप्लिकेट पंक्तियाँ (यदि कोई होनी चाहिए) स्वचालित रूप से समाप्त हो जाती हैं (यदि आप ऐसा नहीं चाहते हैं, तो इसके बजाय UNION ALL उपयोग करें)। स्तंभ संख्या, स्तंभ नाम, आदेश और डेटा प्रकार सभी का चयन करें बयान है कि संघ का हिस्सा हैं भर से मेल खाना चाहिए - यही कारण है कि पहले चयन को जोड़ती FirstName और LastName में कर्मचारी से ContactName

टेबल चर

यह उपयोगी हो सकता है, यदि आपको तालिका चर का उपयोग करने के लिए अस्थायी डेटा (विशेष रूप से संग्रहीत प्रक्रिया में) से निपटने की आवश्यकता है: "वास्तविक" तालिका और तालिका चर के बीच अंतर यह है कि यह अस्थायी प्रसंस्करण के लिए स्मृति में मौजूद है।

उदाहरण:

DECLARE @Region TABLE
(
  RegionID int, 
  RegionDescription NChar(50)
)
 

स्मृति में एक तालिका बनाता है। इस स्थिति में @ उपसर्ग अनिवार्य है क्योंकि यह एक चर है। आप पंक्तियों को सम्मिलित करने, हटाने और चयन करने के लिए ऊपर उल्लिखित सभी डीएमएल संचालन कर सकते हैं, जैसे

INSERT INTO @Region values(3,'Northern')
INSERT INTO @Region values(4,'Southern')
 

लेकिन आम तौर पर, आप इसे एक असली तालिका के आधार पर आबाद करेंगे

INSERT INTO @Region
SELECT * FROM dbo.Region WHERE RegionID>2;
 

जो वास्तविक तालिका dbo.Region से फ़िल्टर किए गए मानों को dbo.Region और इसे स्मृति तालिका @Region में सम्मिलित @Region - जहां इसे आगे की प्रक्रिया के लिए उपयोग किया जा सकता है। उदाहरण के लिए, आप इसका उपयोग किसी जुड़ाव की तरह कर सकते हैं

SELECT * FROM Territories t
JOIN @Region r on t.RegionID=r.RegionID
 

जो इस मामले में सभी Northern और Southern क्षेत्रों को लौटाएगा। अधिक विस्तृत जानकारी यहां पाई जा सकती है । यदि आप उस विषय के बारे में अधिक पढ़ने के इच्छुक हैं, तो यहां अस्थायी तालिकाओं पर चर्चा की जाती है

नोट: Microsoft केवल तालिका चर का उपयोग करने की अनुशंसा करता है यदि तालिका चर में डेटा की पंक्तियों की संख्या 100 से कम है। यदि आप बड़ी मात्रा में डेटा के साथ काम कर रहे हैं, तो इसके बजाय एक अस्थायी तालिका , या अस्थायी तालिका का उपयोग करें।

प्रिंट

आउटपुट कंसोल के लिए एक संदेश प्रदर्शित करें। SQL सर्वर प्रबंधन स्टूडियो का उपयोग करना, यह परिणाम टैब के बजाय संदेश टैब में प्रदर्शित किया जाएगा:

PRINT 'Hello World!';
 

बेसिक सर्वर जानकारी प्राप्त करें

SELECT @@VERSION
 

उदाहरण पर चल रहे MS SQL सर्वर का संस्करण लौटाता है।

SELECT @@SERVERNAME
 

MS SQL सर्वर आवृत्ति का नाम देता है।

SELECT @@SERVICENAME
 

Windows सेवा का नाम MS SQL सर्वर के रूप में चल रहा है।

SELECT serverproperty('ComputerNamePhysicalNetBIOS');
 

जहाँ SQL सर्वर चल रहा है मशीन का भौतिक नाम देता है। एक विफलता क्लस्टर में नोड की पहचान करने के लिए उपयोगी है।

SELECT * FROM fn_virtualservernodes();
 

एक विफलता क्लस्टर में हर नोड जहाँ SQL सर्वर पर चला सकते हैं देता है। यह एक क्लस्टर नहीं तो कुछ नहीं देता है।

किसी तालिका से सभी पंक्तियों और स्तंभों का चयन करें

वाक्य - विन्यास:

SELECT *
FROM table_name
 

तारांकन ऑपरेटर का उपयोग करना * तालिका के सभी स्तंभों को चुनने के लिए एक शॉर्टकट के रूप में कार्य करता है। सभी पंक्तियों का भी चयन किया जाएगा क्योंकि इस SELECT कथन में कोई फ़िल्टर मानदंड निर्दिष्ट करने के लिए WHERE क्लॉज नहीं है।

यह उसी तरह से भी काम करेगा जब आप इस मामले में e लिए तालिका में एक अन्य को जोड़ते हैं:

SELECT *
FROM Employees AS e
 

या यदि आप किसी विशिष्ट तालिका से सभी का चयन करना चाहते हैं तो आप उपनाम + "। *" का उपयोग कर सकते हैं।

SELECT e.*, d.DepartmentName
FROM Employees AS e
    INNER JOIN Department AS d 
        ON e.DepartmentID = d.DepartmentID
 

डेटाबेस ऑब्जेक्ट को पूरी तरह से योग्य नामों का उपयोग करके भी एक्सेस किया जा सकता है:

SELECT * FROM [server_name].[database_name].[schema_name].[table_name]
 

यह आवश्यक रूप से अनुशंसित नहीं है, क्योंकि सर्वर और / या डेटाबेस नामों को बदलने से अमान्य ऑब्जेक्ट नामों के कारण अब पूरी तरह से योग्य नामों का उपयोग करने वाले प्रश्नों का निष्पादन नहीं होगा।

ध्यान दें कि यदि किसी एकल सर्वर, डेटाबेस और स्कीमा पर क्रमशः क्वेरीज़ निष्पादित की जाती हैं, तो table_name से पहले फ़ील्ड को कई मामलों में छोड़ा जा सकता है। हालाँकि, किसी डेटाबेस में एक से अधिक स्कीमा होना आम है, और इन मामलों में स्कीमा का नाम संभव होने पर छोड़ा नहीं जाना चाहिए।

चेतावनी: उत्पादन कोड या संग्रहीत कार्यविधियों में SELECT * का उपयोग करने पर बाद में समस्याएं हो सकती हैं (जैसे कि नए कॉलम तालिका में जोड़े जाते हैं, या यदि स्तंभ तालिका में पुन: व्यवस्थित किए जाते हैं), खासकर यदि आपका कोड स्तंभों के क्रम के बारे में सरल धारणा बनाता है, या स्तंभों की संख्या वापस आ गई। इसलिए उत्पादन कोड के लिए सेलेक्ट स्टेटमेंट में कॉलम के नामों को स्पष्ट रूप से निर्दिष्ट करना अधिक सुरक्षित है।

SELECT col1, col2, col3
FROM table_name
 

उन पंक्तियों का चयन करें जो एक शर्त से मेल खाती हैं

आमतौर पर, वाक्य रचना है:

SELECT <column names>
FROM <table name>
WHERE <condition>
 

उदाहरण के लिए:

SELECT FirstName, Age
FROM Users
WHERE LastName = 'Smith'
 

स्थितियां जटिल हो सकती हैं:

SELECT FirstName, Age
FROM Users
WHERE LastName = 'Smith' AND (City = 'New York' OR City = 'Los Angeles')
 

ट्रिब्यूट टेबल

TRUNCATE TABLE Helloworlds 
 

यह कोड तालिका के सभी डेटा को हटा देगा। Truncate टेबल Delete from Table कोड Delete from Table करने के लिए लगभग समान है। अंतर यह है कि आप ट्रंकट के साथ जहां क्लॉज़ का उपयोग नहीं कर सकते हैं। ट्रंकट टेबल को डिलीट करने से बेहतर माना जाता है क्योंकि यह कम ट्रांजेक्शन लॉग स्पेस का उपयोग करता है।

ध्यान दें कि यदि कोई पहचान स्तंभ मौजूद है, तो यह प्रारंभिक बीज मान के लिए रीसेट हो जाता है (उदाहरण के लिए, ऑटो-इंक्रीमेंट आईडी 1 से पुनरारंभ होगा)। इससे असंगतता हो सकती है यदि पहचान स्तंभ किसी अन्य तालिका में विदेशी कुंजी के रूप में उपयोग किया जाता है।

अद्यतन सभी पंक्तियों

अद्यतन करने का एक सरल रूप तालिका के दिए गए क्षेत्र में सभी मूल्यों को बढ़ाता है। ऐसा करने के लिए, हमें क्षेत्र और वेतन वृद्धि को परिभाषित करने की आवश्यकता है

निम्नलिखित एक उदाहरण है जो Score फ़ील्ड को 1 (सभी पंक्तियों में) बढ़ाता है:

UPDATE Scores
SET score = score + 1  
 

यह खतरनाक हो सकता है क्योंकि आप अपने डेटा को भ्रष्ट कर सकते हैं यदि आप गलती से तालिका में सभी पंक्तियों के लिए एक विशिष्ट पंक्ति के साथ एक अद्यतन के लिए एक अद्यतन बनाते हैं।

अद्यतन विशिष्ट पंक्ति

UPDATE HelloWorlds
SET HelloWorld = 'HELLO WORLD!!!'
WHERE Id = 5
 

उपरोक्त कोड "हेलो वर्ल्ड" के साथ "HelloWorld" क्षेत्र के मूल्य को अपडेट करता है !!! हैलोवियर्स टेबल में जहां "आईडी = 5" रिकॉर्ड है।

नोट: अपडेट स्टेटमेंट में, यह सलाह दी जाती है कि जब तक और जब तक आपकी आवश्यकता अलग न हो, तब तक पूरी तालिका को अपडेट करने से बचने के लिए "कहाँ" का उपयोग करें।

डेटा को सुरक्षित रूप से बदलने के लिए लेनदेन का उपयोग करना

जब भी आप डेटा में बदलाव करते हैं, डेटा मैनिपुलेशन लैंग्वेज (डीएमएल) कमांड में, आप अपने लेन-देन में बदलाव कर सकते हैं। DML में UPDATE , TRUNCATE , INSERT और DELETE । उन तरीकों में से एक जो आप यह सुनिश्चित कर सकते हैं कि आप सही डेटा बदल रहे हैं लेनदेन का उपयोग करना होगा।

डीएमएल परिवर्तन प्रभावित पंक्तियों पर ताला लगाएगा। जब आप लेन-देन शुरू करते हैं, तो आपको लेनदेन को समाप्त करना होगा या डीएमएल में बदली जा रही सभी वस्तुओं को बंद कर दिया जाएगा। आप अपने लेन-देन को ROLLBACK या COMMIT साथ समाप्त कर सकते हैं। ROLLBACK लेनदेन के भीतर अपनी मूल स्थिति में सब कुछ लौटाता है। COMMIT डेटा को अंतिम स्थिति में रखता है जहाँ आप किसी अन्य DML कथन के बिना अपने परिवर्तनों को पूर्ववत नहीं कर सकते।

उदाहरण:

--Create a test table

USE [your database]
GO
CREATE TABLE test_transaction (column_1 varchar(10))
GO

INSERT INTO 
 dbo.test_transaction
        ( column_1 )
VALUES
        ( 'a' )

BEGIN TRANSACTION --This is the beginning of your transaction

UPDATE dbo.test_transaction
SET column_1 = 'B'
OUTPUT INSERTED.*
WHERE column_1 = 'A'
  

ROLLBACK TRANSACTION  --Rollback will undo your changes
           --Alternatively, use COMMIT to save your results

SELECT * FROM dbo.test_transaction   --View the table after your changes have been run

DROP TABLE dbo.test_transaction
 

टिप्पणियाँ:

  • यह एक सरलीकृत उदाहरण है जिसमें त्रुटि हैंडलिंग शामिल नहीं है। लेकिन कोई भी डेटाबेस ऑपरेशन विफल हो सकता है और इसलिए एक अपवाद को फेंक सकता है। यहां एक उदाहरण दिया गया है कि इस तरह की आवश्यक त्रुटि हैंडलिंग कैसे दिख सकती है। आपको किसी त्रुटि हैंडलर के बिना लेन-देन का उपयोग नहीं करना चाहिए, अन्यथा आप किसी अज्ञात स्थिति में लेन-देन छोड़ सकते हैं।
  • आइसोलेशन स्तर के आधार पर, लेन-देन डेटा के क्वेर किए जाने या बदले जाने पर ताले लगा रहा है। आपको यह सुनिश्चित करने की आवश्यकता है कि लेनदेन लंबे समय तक नहीं चल रहे हैं, क्योंकि वे एक डेटाबेस में रिकॉर्ड लॉक करेंगे और अन्य समानांतर चलने वाले लेनदेन के साथ गतिरोध पैदा कर सकते हैं। जितना संभव हो सके लेन-देन में संलग्‍न किए गए संचालन को रखें और उस डेटा की मात्रा के साथ प्रभाव को कम करें, जिसे आप लॉक कर रहे हैं।