Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में XML डेटा संग्रहीत करना

डीबीफोर्ज ट्रांजेक्शन लॉग के रिलीज पर काम करते समय, अन्य कार्यों के साथ, हमारी टीम को यह पता लगाना था कि टाइप किए गए एक्सएमएल डेटा को ठीक से कैसे स्टोर किया जाए।

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

यह भी ध्यान में रखा जाना चाहिए कि, यदि किसी स्तंभ के डेटा प्रकार को साधारण XML के रूप में निर्दिष्ट किया जाता है, तो सर्वर इस डेटा को यूनिकोड स्ट्रिंग्स के रूप में संग्रहीत करेगा।
उदाहरण 1.

CREATE TABLE XmlValuesTable (
  [uid] [int] IDENTITY PRIMARY KEY,
  v XML NOT NULL );
GO
INSERT INTO XmlValuesTable (v)
VALUES ('<note><float>123.456</float><time>01:23:45.789</time></note>');
INSERT INTO XmlValuesTable (v)
VALUES ('<note><float>4.0000000000</float><time>01:23:45Z</time></note>');

सर्वर इन्सर्ट . को स्टोर करेगा डेटा इस प्रकार है:

F0 04 6E006F0074006500 <- Name "note"
EF 000001 <- Namespace 01
F8 01 <- tag 01
F0 05 66006C006F0061007400 <- Name "float"
EF 000002 <- Namespace 02
F8 02 <- tag 02
11 07 3100320033002E00340035003600 <- string "123.456"
F7 <- closing tag
F0 04 740069006D006500 <- Name "time"
EF 000003 <- Namespace 02
F8 03 <- tag 03
11 0C 300031003A00320033003A00340035002E00370038003900 <- string "01:23:45.789"
F7 <- closing tag
F7 <- closing tag

निम्नलिखित उदाहरण में, स्तंभ डेटा प्रकार को XML स्कीमा संग्रह के माध्यम से टाइप किए गए के रूप में निर्दिष्ट किया गया है।

उदाहरण 2.

CREATE XML SCHEMA COLLECTION [XmlValuesSchemaCollection_datetime2] AS
'<?xml version="1.0"?> 
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes"

  <xsd:element name="datetime2" type="sqltypes:datetime2"/> 
</xsd:schema>';
GO

CREATE TABLE XmlValuesTable_datetime2 (
  [uid] [int] IDENTITY PRIMARY KEY,
  v XML(XmlValuesSchemaCollection_datetime2) NOT NULL
);
GO

INSERT INTO XmlValuesTable_datetime2 (v)
VALUES (N'<datetime2>2014-06-18T06:39:05.190</datetime2>');
GO
में जाएं

इस विशेष मामले में, सर्वर सम्मिलित करें . को स्टोर करेगा डेटा इस प्रकार है:

EA 09 014C010015 1A000000 <- type info 0x14C (332) “datetime2”, 0x15 (21) “dateTime” + offset
F0 09 6400610074006500740069006D0065003200 <- Name "datetime2"
EF 000001 <- Namespace 01
F8 01 <- tag 01
EA 05 004C010015 <- type info
7E 02978924A9380B <- "2014-06-18T06:39:05.190"
F7 <- closing tag

इस तरह, सर्वर संग्रहीत डेटा को इस लेख के परिशिष्ट में निर्दिष्ट प्रकारों में परिवर्तित करता है (आप सर्वर पर "sys.xml_schema_types से चयन करें" क्वेरी चलाकर सभी डेटा प्रकारों की सूची देख सकते हैं)।

आइए एक नज़र डालते हैं कि कैसे सर्वर उदाहरण 1 के समान और XML स्कीमा संग्रह के साथ वर्णित अधिक जटिल संरचना को सहेजेगा।

उदाहरण 3.

CREATE XML SCHEMA COLLECTION [XmlValuesSchemaCollection] AS
'<?xml version="1.0"?>
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes"
  attributeFormDefault="unqualified" elementFormDefault="qualified"> 
  <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes"
schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sql2008/sqltypes.xsd"/>

    <xsd:element name="note"> 
     <xsd:complexType> 
       <xsd:sequence> 
          <xsd:element name="float" type="xsd:float"/> 
          <xsd:element name="time" type="xsd:time"/> 
       </xsd:sequence> 
     </xsd:complexType> 
  </xsd:element> 
</xsd:schema>'; 
GO 

CREATE TABLE XmlValuesTable (
  [uid] [int] IDENTITY PRIMARY KEY,
  v XML(XmlValuesSchemaCollection) NOT NULL
);
GO

INSERT INTO XmlValuesTable (v)
VALUES ('<note><float>123.456</float><time>01:23:45.789</time></note>');

सर्वर सम्मिलित करें . को सहेज लेगा डेटा इस प्रकार है:

EA 05 0001000100 <- type info
F0 04 6E006F0074006500 <- Name "note"
EF 000001 <- Namespace
F8 01 <- tag 01
EA 09 0111000011 12000000 <- type info 0x11 (17) "float" + offset
F0 05 66006C006F0061007400 <- Name "float"
EF 000002 <- Namespace
F8 02 <- tag 02
EA 05 0011000011 <- type info 0x11 (17) "float"
03 79E9F642 <- "123.456"
F7 <- closing tag
EA 09 0116000016 10000000 <- type info 0x16 (22) "time" + offset
F0 04 740069006D006500 <- Name "time"
EF 000003 <- Namespace
F8 03 <- tag 03
EA 05 0016000016 <- type info 0x16 (22) "time"
7D 03FDAF4C005B950A <- "01:23:45.789"
F7 <- closing tag
F7 <- closing tag

आइए सम्मिलित करने के लिए एक स्कीमा लिंक जोड़ने का प्रयास करें।

उदाहरण 4.

INSERT INTO XmlValuesTable (v)
VALUES ('<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><float>123.456</float><time>01:23:45.789</time></note>');
EA 05 0001000100 <- type info
F0 04 6E006F0074006500 <- Name "note"
EF 000001 <- Namespace
F8 01 <- tag 01
F0 09 78006D006C006E0073003A00780073006900 <- Name "xmlns:xsi"
EF 000200 <- Namespace "xmlns:xsi"
F6 02 <- Attribute
11 29 68007400740070003A002F002F007700770077002E00770033002E006F00720067002F0032003000300031002F0058004D004C0053006300680065006D0061002D0069006E007300740061006E0063006500 <- "http://www.w3.org/2001/XMLSchema-instance"
F5 <- closing bracket
EA 09 0111000011 12000000 <- type info 0x11 (17) "float" + offset
F0 05 66006C006F0061007400 <- Name "float"
EF 000003 <- Namespace
F8 03 <- tag 03
EA 05 0011000011 <- type info 0x11 (17) "float"
03 79E9F642 <- "123.456"
F7 <- closing tag
EA 09 0116000016 10000000 <- type info 0x16 (22) "time" + offset
F0 04 740069006D006500  <- Name "time"
EF 000004 <- Namespace
F8 04 <- tag 08
EA 05 0016000016 <- type info 0x16 (22) "time"
7D 03FDAF4C005B950A <- "01:23:45.789"
F7 <- closing tag
F7 <- closing tag

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

निष्कर्ष

ऊपर से, ऐसा लग सकता है कि आप कुछ डेटा प्रकारों (जैसे फ्लोट) को टाइप किए गए मानों के रूप में संग्रहीत करके डेटाबेस के आकार को कम कर सकते हैं क्योंकि 4 बाइट्स को यूनिकोड स्ट्रिंग के रूप में सहेजे गए समान मान की तुलना में काफी कम संग्रहण की आवश्यकता होती है। हालांकि, आपको यह ध्यान रखना चाहिए कि प्रत्येक मान के प्रकार का वर्णन करने और उसे आवश्यक स्थान पर ले जाने के लिए अतिरिक्त 7-18 बाइट्स का उपयोग किया जाता है।

परिशिष्ट

XML प्रकार, आधार प्रकार और डेटा प्रकारों का सहसंबंध जो सर्वर टाइप किए गए मानों को संग्रहीत करने के लिए उपयोग करता है।

XML प्रकार आधार प्रकार प्रकार के रूप में संग्रहीत बाइट्स में आकार
कोई भी प्रकार स्ट्रिंग 2 * अक्षर
कोई भी सरल प्रकार कोई भी प्रकार स्ट्रिंग
स्ट्रिंग कोई भी सरल प्रकार स्ट्रिंग
बूलियन कोई भी सरल प्रकार बूलियन 1
फ्लोट कोई भी सरल प्रकार फ्लोट 4
डबल कोई भी सरल प्रकार डबल 8
दशमलव कोई भी सरल प्रकार एसक्लडेसिमल 20
अवधि कोई भी सरल प्रकार स्ट्रिंग
तारीख समय कोई भी सरल प्रकार *1
समय कोई भी सरल प्रकार *1
तारीख कोई भी सरल प्रकार *1
gYearMonth कोई भी सरल प्रकार स्ट्रिंग
जीवर्ष कोई भी सरल प्रकार स्ट्रिंग
gMonthDay कोई भी सरल प्रकार स्ट्रिंग
gDay कोई भी सरल प्रकार स्ट्रिंग
जीमाह कोई भी सरल प्रकार स्ट्रिंग
हेक्सबाइनरी कोई भी सरल प्रकार बाइट्स की सरणी
बेस 64 बाइनरी कोई भी सरल प्रकार बाइट्स की सरणी
anyURI कोई भी सरल प्रकार स्ट्रिंग
QName कोई भी सरल प्रकार स्ट्रिंग
सामान्यीकृत स्ट्रिंग स्ट्रिंग स्ट्रिंग
टोकन स्ट्रिंग स्ट्रिंग
भाषा स्ट्रिंग स्ट्रिंग
नाम स्ट्रिंग स्ट्रिंग
एनसीनाम स्ट्रिंग स्ट्रिंग
ENTITY स्ट्रिंग स्ट्रिंग
NMTOKEN स्ट्रिंग स्ट्रिंग
पूर्णांक दशमलव एसक्लडेसिमल 20
गैर सकारात्मक पूर्णांक पूर्णांक एसक्लडेसिमल 20
नकारात्मक पूर्णांक गैर सकारात्मक पूर्णांक एसक्लडेसिमल 20
लंबा पूर्णांक एसक्लडेसिमल 20
int लंबा एसक्लडेसिमल 20
संक्षिप्त इंट एसक्लडेसिमल 20
बाइट संक्षिप्त एसक्लडेसिमल 20
गैर-नकारात्मक पूर्णांक पूर्णांक एसक्लडेसिमल 20
अहस्ताक्षरित लंबा गैर नकारात्मक पूर्णांक एसक्लडेसिमल 20
unsignedInt अहस्ताक्षरित लंबा एसक्लडेसिमल 20
अहस्ताक्षरित लघु unsignedInt एसक्लडेसिमल 20
अहस्ताक्षरितबाइट अहस्ताक्षरित लघु एसक्लडेसिमल 20
सकारात्मक पूर्णांक गैर नकारात्मक पूर्णांक एसक्लडेसिमल 20
चार स्ट्रिंग स्ट्रिंग
nchar स्ट्रिंग स्ट्रिंग
वर्कर स्ट्रिंग स्ट्रिंग
नवरचर स्ट्रिंग स्ट्रिंग
पाठ स्ट्रिंग स्ट्रिंग
ntext स्ट्रिंग स्ट्रिंग
varbinary बेस64बाइनरी बाइट्स की सरणी
बाइनरी बेस64बाइनरी बाइट्स की सरणी
छवि बेस64बाइनरी बाइट्स की सरणी
टाइमस्टैम्प बेस64बाइनरी बाइट्स की सरणी
टाइमस्टैम्पसंख्यात्मक लंबा एसक्लडेसिमल 20
संख्यात्मक दशमलव एसक्लडेसिमल 20
बिगिंट लंबा एसक्लडेसिमल 20
छोटा सा संक्षिप्त एसक्लडेसिमल 20
छोटेपन अहस्ताक्षरितबाइट एसक्लडेसिमल 20
बिट बूलियन बूलियन 1
असली फ्लोट फ्लोट 4
तारीख तारीख समय *1
स्मॉलडेटटाइम तारीख समय *1
पैसा दशमलव एसक्लडेसिमल
छोटी रकम दशमलव एसक्लडेसिमल
अद्वितीय पहचानकर्ता दशमलव स्ट्रिंग
डेटाटाइम2 तारीख समय *1
डेटाटाइमऑफ़सेट तारीख समय *1
पदानुक्रमित स्ट्रिंग स्ट्रिंग
dboject anyURI स्ट्रिंग

* 1 - डेटा / समय की जानकारी। विशिष्ट प्रकार को मान द्वारा परिभाषित किया जाता है।

मान प्रकार के रूप में संग्रहीत बाइट्स में आकार
दिनांक ऑफसेट तारीख (दिनों की राशि) 3
दिनांक ऑफसेट (2019-09-16+02:00) DateTimeOffset 11
दिनांक समय दिनांक समय 7-9 सटीकता पर निर्भर करता है
दिनांक समय ऑफसेट DateTimeOffset 9
समय दिनांक समय 7-9 सटीकता पर निर्भर करता है
समय ऑफसेट (01:23:45Z) DateTimeOffset 9

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में केवल दिनांक के साथ डेटाटाइम की तुलना कैसे करें

  2. SQL सर्वर में, मैं किसी दी गई तालिका के लिए CREATE TABLE स्टेटमेंट कैसे जेनरेट करूं?

  3. SQL सर्वर 2005 में गतिरोध का निदान

  4. त्रुटियाँ:INSERT EXEC कथन नेस्ट नहीं किया जा सकता। और INSERT-EXEC कथन के भीतर ROLLBACK कथन का उपयोग नहीं कर सकता। इसे कैसे हल करें?

  5. SQL सर्वर में डेटा कैसे डालें