| About the Author |
|
xix | |
| About the Technical Reviewer |
|
xxi | |
| Acknowledgments |
|
xxiii | |
|
|
|
1 | (218) |
|
Chapter 1 Introducing XML |
|
|
3 | (20) |
|
|
|
3 | (5) |
|
|
|
4 | (1) |
|
|
|
4 | (2) |
|
Entitizing XML Characters |
|
|
6 | (1) |
|
Exploring the XML Data Type |
|
|
7 | (1) |
|
1-1 Creating an Untyped XML Column |
|
|
8 | (3) |
|
|
|
8 | (1) |
|
|
|
8 | (2) |
|
|
|
10 | (1) |
|
1-2 Creating an XML Schema in Visual Studio |
|
|
11 | (3) |
|
|
|
11 | (1) |
|
|
|
11 | (2) |
|
|
|
13 | (1) |
|
1-3 Creating an XML Schema from SSMS |
|
|
14 | (4) |
|
|
|
14 | (1) |
|
|
|
15 | (1) |
|
|
|
16 | (2) |
|
1-4 Binding XML to a Schema Collection |
|
|
18 | (2) |
|
|
|
18 | (1) |
|
|
|
18 | (1) |
|
|
|
19 | (1) |
|
1-5 Creating a Typed XML Column |
|
|
20 | (2) |
|
|
|
20 | (1) |
|
|
|
21 | (1) |
|
|
|
21 | (1) |
|
|
|
22 | (1) |
|
|
|
23 | (30) |
|
Fixing the "Unable to show XML" Error |
|
|
24 | (2) |
|
2-1 Converting Relational Data to a Simple XML Format |
|
|
26 | (2) |
|
|
|
26 | (1) |
|
|
|
26 | (1) |
|
|
|
26 | (2) |
|
2-2 Generating XML Data with Table Names as Element Names |
|
|
28 | (2) |
|
|
|
28 | (1) |
|
|
|
28 | (2) |
|
|
|
30 | (1) |
|
2-3 Generating Element-Centric XML |
|
|
30 | (2) |
|
|
|
30 | (1) |
|
|
|
31 | (1) |
|
|
|
31 | (1) |
|
2-4 Adding a Root Element |
|
|
32 | (1) |
|
|
|
32 | (1) |
|
|
|
32 | (1) |
|
|
|
33 | (1) |
|
2-5 Including Elements with NULL Values in Your XML Data |
|
|
33 | (1) |
|
|
|
33 | (1) |
|
|
|
33 | (1) |
|
|
|
34 | (1) |
|
2-6 Including Binary Data in Your XML |
|
|
34 | (2) |
|
|
|
34 | (1) |
|
|
|
34 | (1) |
|
|
|
35 | (1) |
|
2-7 Generating Nested Hierarchical XML Data |
|
|
36 | (2) |
|
|
|
36 | (1) |
|
|
|
36 | (2) |
|
|
|
38 | (1) |
|
|
|
38 | (7) |
|
|
|
38 | (1) |
|
|
|
38 | (2) |
|
|
|
40 | (5) |
|
2-9 Simplifying Custom XML Generation |
|
|
45 | (3) |
|
|
|
45 | (1) |
|
|
|
45 | (1) |
|
|
|
46 | (2) |
|
2-10 Adding Special Nodes to Your XML |
|
|
48 | (3) |
|
|
|
48 | (1) |
|
|
|
48 | (1) |
|
|
|
49 | (2) |
|
|
|
51 | (2) |
|
Chapter 3 Manipulating XML Files |
|
|
53 | (48) |
|
3-1 Storing XML Result in a File from SQL |
|
|
53 | (6) |
|
|
|
53 | (1) |
|
|
|
53 | (2) |
|
|
|
55 | (4) |
|
3-2 Creating XML from an SSIS Package |
|
|
59 | (13) |
|
|
|
59 | (1) |
|
|
|
59 | (13) |
|
|
|
72 | (1) |
|
3-3 Loading XML from a Stored Procedure |
|
|
72 | (6) |
|
|
|
72 | (1) |
|
|
|
72 | (3) |
|
|
|
75 | (3) |
|
3-4 Loading XML from SSIS Package |
|
|
78 | (14) |
|
|
|
78 | (1) |
|
|
|
78 | (12) |
|
|
|
90 | (2) |
|
3-5 Implementing a CLR Solution |
|
|
92 | (7) |
|
|
|
92 | (1) |
|
|
|
92 | (4) |
|
|
|
96 | (3) |
|
|
|
99 | (2) |
|
|
|
101 | (34) |
|
4-1 Shredding XML with Internal ENTITY Declarations |
|
|
101 | (7) |
|
|
|
101 | (1) |
|
|
|
101 | (1) |
|
|
|
102 | (6) |
|
4-2 Migrating OPENXML into XQuery |
|
|
108 | (5) |
|
|
|
108 | (1) |
|
|
|
108 | (1) |
|
|
|
109 | (4) |
|
4-3 Shredding XML from a Column |
|
|
113 | (3) |
|
|
|
113 | (1) |
|
|
|
113 | (1) |
|
|
|
114 | (2) |
|
4-4 Dealing with Legacy XML Storage |
|
|
116 | (4) |
|
|
|
116 | (1) |
|
|
|
117 | (1) |
|
|
|
118 | (2) |
|
4-5 Navigating Typed XML Columns |
|
|
120 | (3) |
|
|
|
120 | (1) |
|
|
|
120 | (2) |
|
|
|
122 | (1) |
|
4-6 Retrieving a Subset of Your XML Data |
|
|
123 | (4) |
|
|
|
123 | (1) |
|
|
|
123 | (1) |
|
|
|
124 | (3) |
|
4-7 Finding All XML Columns in a Table |
|
|
127 | (5) |
|
|
|
127 | (1) |
|
|
|
127 | (2) |
|
|
|
129 | (3) |
|
4-8 Using Multiple CROSS APPLY Operators |
|
|
132 | (2) |
|
|
|
132 | (1) |
|
|
|
132 | (1) |
|
|
|
133 | (1) |
|
|
|
134 | (1) |
|
|
|
135 | (22) |
|
5-1 Inserting a Child Element into Your XML |
|
|
135 | (2) |
|
|
|
135 | (1) |
|
|
|
135 | (1) |
|
|
|
136 | (1) |
|
5-2 Inserting a Child Element into an Existing XML Instance with Namespace |
|
|
137 | (3) |
|
|
|
137 | (1) |
|
|
|
137 | (1) |
|
|
|
138 | (2) |
|
5-3 Inserting XML Attributes |
|
|
140 | (3) |
|
|
|
140 | (1) |
|
|
|
140 | (1) |
|
|
|
141 | (2) |
|
5-4 Inserting XML Attribute Conditionally |
|
|
143 | (1) |
|
|
|
143 | (1) |
|
|
|
143 | (1) |
|
|
|
144 | (1) |
|
5-5 Inserting a Child Element with Position Specification |
|
|
144 | (2) |
|
|
|
144 | (1) |
|
|
|
144 | (2) |
|
|
|
146 | (1) |
|
5-6 Inserting Multiple Elements |
|
|
146 | (2) |
|
|
|
146 | (1) |
|
|
|
146 | (1) |
|
|
|
147 | (1) |
|
5-7 Updating an XML Element Value |
|
|
148 | (2) |
|
|
|
148 | (1) |
|
|
|
148 | (1) |
|
|
|
149 | (1) |
|
5-8 Updating XML Attribute Value |
|
|
150 | (1) |
|
|
|
150 | (1) |
|
|
|
150 | (1) |
|
|
|
151 | (1) |
|
5-9 Deleting an XML Attribute |
|
|
151 | (2) |
|
|
|
151 | (1) |
|
|
|
151 | (1) |
|
|
|
152 | (1) |
|
5-10 Deleting an XML Element |
|
|
153 | (3) |
|
|
|
153 | (1) |
|
|
|
153 | (1) |
|
|
|
154 | (2) |
|
|
|
156 | (1) |
|
|
|
157 | (28) |
|
6-1 Implementing the exist() Method |
|
|
157 | (3) |
|
|
|
157 | (1) |
|
|
|
157 | (1) |
|
|
|
158 | (2) |
|
6-2 Filtering an XML Value with the exist() Method |
|
|
160 | (4) |
|
|
|
160 | (1) |
|
|
|
160 | (1) |
|
|
|
161 | (3) |
|
6-3 Finding All Occurrences of an XML Element Anywhere Within an XML Instance |
|
|
164 | (3) |
|
|
|
164 | (1) |
|
|
|
164 | (2) |
|
|
|
166 | (1) |
|
6-4 Filtering by Single Value |
|
|
167 | (1) |
|
|
|
167 | (1) |
|
|
|
167 | (1) |
|
|
|
168 | (1) |
|
6-5 Filtering XML by T-SQL Variable |
|
|
168 | (2) |
|
|
|
168 | (1) |
|
|
|
168 | (1) |
|
|
|
169 | (1) |
|
6-6 Comparing to a Sequence of Values |
|
|
170 | (1) |
|
|
|
170 | (1) |
|
|
|
170 | (1) |
|
|
|
171 | (1) |
|
6-7 Matching a Specified String Pattern |
|
|
171 | (3) |
|
|
|
171 | (1) |
|
|
|
172 | (1) |
|
|
|
172 | (2) |
|
6-8 Filtering a Range of Values |
|
|
174 | (1) |
|
|
|
174 | (1) |
|
|
|
174 | (1) |
|
|
|
175 | (1) |
|
6-9 Filtering by Multiple Conditions |
|
|
175 | (2) |
|
|
|
175 | (1) |
|
|
|
175 | (1) |
|
|
|
176 | (1) |
|
6-10 Setting a Negative Predicate |
|
|
177 | (1) |
|
|
|
177 | (1) |
|
|
|
177 | (1) |
|
|
|
178 | (1) |
|
6-11 Filtering Empty Values |
|
|
178 | (4) |
|
|
|
178 | (1) |
|
|
|
179 | (1) |
|
|
|
180 | (2) |
|
|
|
182 | (3) |
|
Chapter 7 Improving XML Performance |
|
|
185 | (34) |
|
7-1 Creating a Primary XML Index |
|
|
185 | (8) |
|
|
|
185 | (1) |
|
|
|
185 | (2) |
|
|
|
187 | (6) |
|
7-2 Creating a Secondary PATH Type Index |
|
|
193 | (3) |
|
|
|
193 | (1) |
|
|
|
193 | (2) |
|
|
|
195 | (1) |
|
7-3 Creating a Secondary VALUE Type Index |
|
|
196 | (4) |
|
|
|
196 | (1) |
|
|
|
196 | (2) |
|
|
|
198 | (2) |
|
7-4 Creating a Secondary PROPERTY Type Index |
|
|
200 | (2) |
|
|
|
200 | (1) |
|
|
|
200 | (2) |
|
|
|
202 | (1) |
|
7-5 Creating a Selective XML Index |
|
|
202 | (8) |
|
|
|
202 | (1) |
|
|
|
203 | (2) |
|
|
|
205 | (5) |
|
7-6 Optimizing a Selective XML Index |
|
|
210 | (3) |
|
|
|
210 | (1) |
|
|
|
210 | (1) |
|
|
|
211 | (2) |
|
7-7 Creating a Secondary Selective XML Index |
|
|
213 | (2) |
|
|
|
213 | (1) |
|
|
|
213 | (1) |
|
|
|
214 | (1) |
|
7-8 Modifying Selective XML Indexes |
|
|
215 | (3) |
|
|
|
215 | (1) |
|
|
|
215 | (2) |
|
|
|
217 | (1) |
|
|
|
218 | (1) |
|
Part II JSON in SQL Server |
|
|
219 | (68) |
|
Chapter 8 Constructing JSON |
|
|
221 | (24) |
|
|
|
221 | (4) |
|
8-1 Building JSON with AUTO Mode |
|
|
225 | (5) |
|
|
|
225 | (1) |
|
|
|
225 | (1) |
|
|
|
226 | (4) |
|
8-2 Handling NULL When JSON Build |
|
|
230 | (2) |
|
|
|
230 | (1) |
|
|
|
230 | (1) |
|
|
|
231 | (1) |
|
8-3 Escaping the Brackets for JSON Output |
|
|
232 | (1) |
|
|
|
232 | (1) |
|
|
|
232 | (1) |
|
|
|
232 | (1) |
|
8-4 Adding ROOT Key Element to JSON |
|
|
233 | (1) |
|
|
|
233 | (1) |
|
|
|
233 | (1) |
|
|
|
233 | (1) |
|
8-5 Gaining Control over JSON Output |
|
|
234 | (5) |
|
|
|
234 | (1) |
|
|
|
234 | (1) |
|
|
|
235 | (4) |
|
8-6 Handling Escape Characters |
|
|
239 | (2) |
|
|
|
239 | (1) |
|
|
|
239 | (1) |
|
|
|
240 | (1) |
|
8-7 Dealing with CLR Data Types |
|
|
241 | (3) |
|
|
|
241 | (1) |
|
|
|
242 | (1) |
|
|
|
243 | (1) |
|
|
|
244 | (1) |
|
Chapter 9 Converting JSON to Row Sets |
|
|
245 | (24) |
|
9-1 Detecting the Columns with JSON |
|
|
245 | (4) |
|
|
|
245 | (1) |
|
|
|
245 | (2) |
|
|
|
247 | (2) |
|
9-2 Returning a Subset of a JSON Document |
|
|
249 | (2) |
|
|
|
249 | (1) |
|
|
|
249 | (1) |
|
|
|
250 | (1) |
|
9-3 Returning a Scalar Value from JSON |
|
|
251 | (3) |
|
|
|
251 | (1) |
|
|
|
251 | (1) |
|
|
|
252 | (2) |
|
9-4 Troubleshooting a Returned NULL |
|
|
254 | (1) |
|
|
|
254 | (1) |
|
|
|
254 | (1) |
|
|
|
254 | (1) |
|
9-5 Converting JSON into a Table |
|
|
255 | (4) |
|
|
|
255 | (1) |
|
|
|
255 | (1) |
|
|
|
256 | (3) |
|
9-6 Processing JSON Nested Sub-Objects |
|
|
259 | (4) |
|
|
|
259 | (1) |
|
|
|
259 | (3) |
|
|
|
262 | (1) |
|
|
|
263 | (4) |
|
|
|
263 | (1) |
|
|
|
263 | (1) |
|
|
|
264 | (3) |
|
|
|
267 | (2) |
|
Chapter 10 Modifying JSON |
|
|
269 | (18) |
|
10-1 Adding a New Key-Value Pair to JSON |
|
|
269 | (1) |
|
|
|
269 | (1) |
|
|
|
269 | (1) |
|
|
|
270 | (1) |
|
10-2 Updating Existing JSON |
|
|
270 | (1) |
|
|
|
270 | (1) |
|
|
|
270 | (1) |
|
|
|
271 | (1) |
|
|
|
271 | (2) |
|
|
|
271 | (1) |
|
|
|
271 | (1) |
|
|
|
271 | (2) |
|
10-4 Appending a JSON Property |
|
|
273 | (1) |
|
|
|
273 | (1) |
|
|
|
273 | (1) |
|
|
|
274 | (1) |
|
10-5 Modifying with Multiple Actions |
|
|
274 | (1) |
|
|
|
274 | (1) |
|
|
|
274 | (1) |
|
|
|
275 | (1) |
|
|
|
275 | (2) |
|
|
|
275 | (1) |
|
|
|
275 | (1) |
|
|
|
276 | (1) |
|
10-7 Modifying a JSON Object |
|
|
277 | (2) |
|
|
|
277 | (1) |
|
|
|
277 | (1) |
|
|
|
277 | (2) |
|
10-8 Comparing XML vs. JSON |
|
|
279 | (6) |
|
|
|
279 | (1) |
|
|
|
279 | (4) |
|
|
|
283 | (2) |
|
|
|
285 | (2) |
| Index |
|
287 | |