100% found this document useful (3 votes)
81 views

Complete Download SQL Server 2000 Stored Procedures XML Programming 2nd Edition Dejan Sunderic PDF All Chapters

Sunderic

Uploaded by

thiawtheman10
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (3 votes)
81 views

Complete Download SQL Server 2000 Stored Procedures XML Programming 2nd Edition Dejan Sunderic PDF All Chapters

Sunderic

Uploaded by

thiawtheman10
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 60

Download the full version of the ebook at ebookname.

com

SQL Server 2000 Stored Procedures XML Programming


2nd Edition Dejan Sunderic

https://ebookname.com/product/sql-server-2000-stored-
procedures-xml-programming-2nd-edition-dejan-sunderic/

OR CLICK BUTTON

DOWNLOAD EBOOK

Download more ebook instantly today at https://ebookname.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

Programming Oracle Triggers and Stored Procedures 3rd


Edition Feng Yuan

https://ebookname.com/product/programming-oracle-triggers-and-stored-
procedures-3rd-edition-feng-yuan/

ebookname.com

Pro SQL Server 2008 XML 1st Edition Michael Coles (Auth.)

https://ebookname.com/product/pro-sql-server-2008-xml-1st-edition-
michael-coles-auth/

ebookname.com

Professional SQL Server 2000 Data Warehousing with


Analysis Services 1st Edition Chris Graves

https://ebookname.com/product/professional-sql-server-2000-data-
warehousing-with-analysis-services-1st-edition-chris-graves/

ebookname.com

Against the Wind Kat Martin

https://ebookname.com/product/against-the-wind-kat-martin/

ebookname.com
Bernard Shaw and the French 1st Edition Michel W. Pharand

https://ebookname.com/product/bernard-shaw-and-the-french-1st-edition-
michel-w-pharand/

ebookname.com

New Orleans Kitchens Recipes from the Big Easy s Best


Restaurants 1st Edition Stacey Meyer

https://ebookname.com/product/new-orleans-kitchens-recipes-from-the-
big-easy-s-best-restaurants-1st-edition-stacey-meyer/

ebookname.com

Audio visual Coverage of Courts A Comparative Analysis 1st


Edition Daniel Stepniak

https://ebookname.com/product/audio-visual-coverage-of-courts-a-
comparative-analysis-1st-edition-daniel-stepniak/

ebookname.com

Structures Or Why Things Don t Fall Down Gordon

https://ebookname.com/product/structures-or-why-things-don-t-fall-
down-gordon/

ebookname.com

Locating Health 1st Edition Erika Dyck

https://ebookname.com/product/locating-health-1st-edition-erika-dyck/

ebookname.com
Consciousness in Indian Philosophy The Advaita Doctrine of
Awareness Only Routledge Hindu Studies Series 1st Edition
Sthan Timalsina
https://ebookname.com/product/consciousness-in-indian-philosophy-the-
advaita-doctrine-of-awareness-only-routledge-hindu-studies-series-1st-
edition-sthan-timalsina/
ebookname.com
SQL Server 2000
TM

Stored Procedure
& XML Programming
Second Edition

Dejan Šunderic

McGraw-Hill/Osborne
New York Chicago San Francisco
Lisbon London Madrid Mexico City Milan
New Delhi San Juan Seoul Singapore Sydney Toronto
McGraw-Hill/Osborne
2100 Powell Street, 10th Floor
Emeryville, California 94608
U.S.A.

To arrange bulk purchase discounts for sales promotions, premiums, or fund-raisers, please contact
McGraw-Hill/Osborne at the above address. For information on translations or book distributors
outside the U.S.A., please see the International Contact Information page immediately following the
index of this book.

SQL Server™ 2000 Stored Procedure & XML Programming, Second Edition

Copyright © 2003 by The McGraw-Hill Companies. All rights reserved. Printed in the United States
of America. Except as permitted under the Copyright Act of 1976, no part of this publication may be
reproduced or distributed in any form or by any means, or stored in a database or retrieval system,
without the prior written permission of publisher, with the exception that the program listings may be
entered, stored, and executed in a computer system, but they may not be reproduced for publication.
1234567890 CUS CUS 019876543
ISBN 0-07-222896-2

Publisher Brandon A. Nordin


Vice President & Associate Publisher Scott Rogers
Acquisitions Editor Lisa McClain
Project Editor Janet Walden
Acquisitions Coordinator Athena Honore
Technical Editor Deborah Bechtold
Development Editor Tom Woodhead
Copy Editor William McManus
Proofreader Laurie Stewart
Indexer Valerie Robbins
Computer Designers Carie Abrew, Tara A. Davis, Lucie Ericksen
Illustrators Lyssa Wald, Melinda Moore Lytle, Kathleen Fay Edwards
Series Designer Peter F. Hancik
Cover Series Designer Pattie Lee

This book was composed with Corel VENTURA™ Publisher.

Information has been obtained by McGraw-Hill/Osborne from sources believed to be reliable. However, because of the possibility
of human or mechanical error by our sources, McGraw-Hill/Osborne, or others, McGraw-Hill/Osborne does not guarantee the
accuracy, adequacy, or completeness of any information and is not responsible for any errors or omissions or the results obtained
from the use of such information.
Writing a book isn’t easy, but living with someone
who is writing a book can be, at times, even harder.
I would like to thank my family for their patience,
understanding, and inspiration.

Acknowledgments
I wish to thank all the people who helped to make this book a reality,
in particular:

 Tom Woodhead, for straightening the winding course of my writings.


 Olga Baranova, who created several examples for Chapters 10, 11, and 15.
 Wendy Rinaldi and Lisa McClain, for the opportunity to do this project.
 Athena Honore and Janet Walden, for their patience, expertise, and
hard work.
 Deborah Bechtold, for her expertise and hard work beyond the call of duty.
About the Author
Dejan Šunderic is the principal consultant at Trigon Blue, Inc. (www.trigonblue.com).
He specializes in database and application development for Internet and
Windows platforms.
Projects that he has been involved with cover B2C and B2B e-commerce, financial,
document-management, mortgage, asset management, insurance, real-estate, IT
supply chain, process control, communication, data warehouse, and OLAP systems.
Dejan has worked as a database architect, database and application developer, database
administrator, team leader, project manager, writer, and technical trainer.
He is the author of SQL Server 2000 Stored Procedure Programming (www
.trigonblue.com/stored_procedure.htm), coauthor of Windows 2000 Performance
Tuning and Optimization, and three other books, as well as numerous technical
articles for several computer and professional publications.
His career started in Belgrade, Yugoslavia where he graduated on Faculty of
Electrical Engineering. In 1995 he moved to Toronto, Canada and he is currently
in Pittsburgh, U.S.A. He holds certifications for Microsoft Certified Solution
Developer (MCSD), Microsoft Certified Database Administrator (MCDBA), and
Certified SQL Server Programmer Master Level. Dejan is a member of Toronto
SQL Server User Group (www.tssug.com), Visual Basic Developer’s Online
Group (www.visualbyte.com/vbdogs), Pittsburgh SQL Server User Group
(www.pssug.com), and Professional Association for SQL Server (www.sqlpass.org).
Dejan can be contacted by email (dejan’s username on hotmail.com server; to
avoid spam filter, put sp_book in the subject) or the book’s web site (www
.trigonblue.com/sqlxml).
Contents at a Glance
Chapter 1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Chapter 2 The SQL Server Environment . . . . . . . . . . . . . . . . . . . . . . . . . 19
Chapter 3 Stored Procedure Design Concepts . . . . . . . . . . . . . . . . . . . . . . 53
Chapter 4 Basic Transact-SQL Programming Constructs . . . . . . . . . . . . . . . . 85
Chapter 5 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Chapter 6 Composite Transact-SQL Constructs: Batches,
Scripts, and Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Chapter 7 Debugging and Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . 207
Chapter 8 Special Types of Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Chapter 9 Advanced Stored Procedure Programming . . . . . . . . . . . . . . . . . . 341
Chapter 10 Interaction with the SQL Server Environment . . . . . . . . . . . . . . . . 389
Chapter 11 Source Code Management and Database Deployment . . . . . . . . . . . 437
Chapter 12 Stored Procedures for Web Search Engines . . . . . . . . . . . . . . . . . 467
Chapter 13 Introduction to XML for Database Developers . . . . . . . . . . . . . . . 489
Chapter 14 Publishing Information Using SQLXML . . . . . . . . . . . . . . . . . . . . 527
Chapter 15 Modifying Databases Using SQLXML . . . . . . . . . . . . . . . . . . . . . 605
Appendix T-SQL and XML Data Types in SQL Server 2000 . . . . . . . . . . . . . . 659

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669

v
This page intentionally left blank
Contents
Chapter 1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Who Should Read This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
What You Will Find in This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Stored Procedure Programming Requirements . . . . . . . . . . . . . . . . . . . 5
XML Programming Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Sample Database and Other Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Sample Database Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Purpose and Design of the Sample Database . . . . . . . . . . . . . . . . . . . . 9
Database Diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Chapter 2 The SQL Server Environment . . . . . . . . . . . . . . . . . . . . . . . . . 19


SQL Server 2000 Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Service Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Query Analyzer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Enterprise Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
DTS and Import/Export Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
osql and isql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
SQL Server Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Client Network Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Server Network Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
The Help Subsystem and SQL Server Books Online . . . . . . . . . . . . . . . . . 29
SQL Server on the Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Basic Operations with Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . 31
What Are Stored Procedures? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Execution of Stored Procedures from Query Analyzer . . . . . . . . . . . . . . . . 32
Managing Stored Procedures from Enterprise Manager . . . . . . . . . . . . . . . 36

vii
viii SQL Server 2000 Stored Procedure & XML Programming

Editing Stored Procedures in Enterprise Manager . . . . . . . . . . . . . . . . . . 41


Editing Stored Procedures in Query Analyzer . . . . . . . . . . . . . . . . . . . . 41
Syntax Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Naming Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Why Bother? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Naming Objects and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Suggested Convention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

Chapter 3 Stored Procedure Design Concepts . . . . . . . . . . . . . . . . . . . . . . 53


Anatomy of a Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Types of Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
The Compilation and Execution Process . . . . . . . . . . . . . . . . . . . . . . . 67
Reuse of Execution Plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Recompiling Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Storing Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Managing Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Listing Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Viewing Code of Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . 77
Renaming Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Deleting Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Listing Dependent and Depending Objects . . . . . . . . . . . . . . . . . . . . . . 80
The Role of Stored Procedures in the Development of Database Applications . . . . . . . . . 82
Enforcement of Data Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Consistent Implementation of Complex Business Rules and Constraints . . . . . . . . 83
Modular Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Maintainability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Reduced Network Traffic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Faster Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Enforcement of Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Chapter 4 Basic Transact-SQL Programming Constructs . . . . . . . . . . . . . . . . 85


T-SQL Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Database Object Qualifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Contents ix

Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Character Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Unicode Character Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Date and Time Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Integer Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Approximate Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Exact Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Monetary Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Binary Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Special Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Local Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Global Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Table Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Flow-Control Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Statement Blocks: Begin…End . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Conditional Execution: The If Statement . . . . . . . . . . . . . . . . . . . . . . . 112
Looping: The While Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Unconditional Execution: The GoTo Statement . . . . . . . . . . . . . . . . . . . . 119
Scheduled Execution: The WaitFor Statement . . . . . . . . . . . . . . . . . . . . 121
Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Transact-SQL Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Cursor-Related Statements and Functions . . . . . . . . . . . . . . . . . . . . . . 126
Problems with Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
The Justified Uses of Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Chapter 5 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131


Using Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
In Selection and Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
As Part of the Selection Criteria . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
In Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
As Check and Default Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Instead of Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Types of Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Scalar Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Aggregate Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Rowset Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
x SQL Server 2000 Stored Procedure & XML Programming

Chapter 6 Composite Transact-SQL Constructs: Batches,


Scripts, and Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Batches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Using Batches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Batches and Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
DDL Batches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Self-Sufficient Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Database Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Autocommit Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Explicit Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Implicit Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Transaction Processing Architecture . . . . . . . . . . . . . . . . . . . . . . . . . 186
Nested Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Named Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Savepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Distributed Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Typical Locking Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

Chapter 7 Debugging and Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . 207


Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
What Is a “Bug”? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
The Debugging Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Debugging Tools and Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . 212
SQL Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Typical Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Raiserror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Using Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Why Bother? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Tactics of Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
A Coherent Error Handling Methodology . . . . . . . . . . . . . . . . . . . . . . 243
Xact_Abort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Another Coherent Error Handling Methodology . . . . . . . . . . . . . . . . . . . 252
Contents xi

Chapter 8 Special Types of Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . 259


Types of Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
User-Defined Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
System Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Extended Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Temporary Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Global Temporary Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . 270
Remote Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Design of User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Table-Valued User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . 276
Inline Table-Valued User-Defined Functions . . . . . . . . . . . . . . . . . . . . . 279
Managing User-Defined Functions in Enterprise Manager . . . . . . . . . . . . . . 281
Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Physical Design of After Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Handling Changes on Multiple Records . . . . . . . . . . . . . . . . . . . . . . . 291
Nested and Recursive Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Trigger Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Instead-of Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Triggers on Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Trigger Order of Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Managing Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Trigger Design Recommendations . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Transaction Management in Triggers . . . . . . . . . . . . . . . . . . . . . . . . 304
Using Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Design of Standard SQL Views . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Dynamic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
INFORMATION_SCHEMA Views . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Indexed Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Partitioned Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Using SQL Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

Chapter 9 Advanced Stored Procedure Programming . . . . . . . . . . . . . . . . . . 341


Dynamically Constructed Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Executing a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
xii SQL Server 2000 Stored Procedure & XML Programming

Query By Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344


Data Script Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Using the sp_executesql Stored Procedure . . . . . . . . . . . . . . . . . . . . . 351
Security Implications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Optimistic Locking Using timestamp Values . . . . . . . . . . . . . . . . . . . . . . . . . 356
timestamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
TSEqual() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
timestamp Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Full-Text Search and Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Nested Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Using Temporary Tables to Pass a Recordset to a Nested Stored Procedure . . . . . . 365
Using a Cursor to Pass a Recordset to a Nested Stored Procedure . . . . . . . . . . 368
How to Process the Result Set of a Stored Procedure . . . . . . . . . . . . . . . . . 371
Using Identity Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
A Standard Problem and Solution . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Identity Values and Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Last Identity Value in the Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
GUIDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
A While Loop with Min() or Max() Functions . . . . . . . . . . . . . . . . . . . . . . . . 383
Looping with sp_MSForEachTable and sp_MSForEachDb . . . . . . . . . . . . . . . . . . . 385
Property Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386

Chapter 10 Interaction with the SQL Server Environment . . . . . . . . . . . . . . . . 389


Execution of OLE Automation/COM Objects . . . . . . . . . . . . . . . . . . . . . . . . . 390
Data Type Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Running Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Running Windows Script Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Running/Looping Through DTS Packages . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Interacting with the NT Registry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
xp_regread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
xp_regwrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Jobs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Administration of Jobs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
An Alternative to Job Scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Stored Procedures for Maintaining Jobs . . . . . . . . . . . . . . . . . . . . . . . 405
Operators and Alerts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Contents xiii

SQL Server and the Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407


Web Assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Web Task Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Web Page Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
E-Mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Extended Stored Procedures for Working with E-Mail . . . . . . . . . . . . . . . . 416
Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Security Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Implementing Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Synchronization of Login and Usernames . . . . . . . . . . . . . . . . . . . . . . 430
Managing Application Security Using Stored Procedures,
User-Defined Functions, and Views . . . . . . . . . . . . . . . . . . . . . . . 432
Managing Application Security Using a Proxy User . . . . . . . . . . . . . . . . . 434
Managing Application Security Using Application Roles . . . . . . . . . . . . . . . 436

Chapter 11 Source Code Management and Database Deployment . . . . . . . . . . . 437


The Concept of Source Code Management . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Introduction to Microsoft Visual SourceSafe . . . . . . . . . . . . . . . . . . . . . 439
Administering the Visual SourceSafe Database . . . . . . . . . . . . . . . . . . . 440
Adding Database Objects to Visual SourceSafe in Visual Studio .NET . . . . . . . . . 440
Managing Create Scripts in Visual Studio .NET . . . . . . . . . . . . . . . . . . . . 443
Visual SourceSafe Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Adding Database Objects to Visual SourceSafe: Traditional Approach . . . . . . . . . 451
Database Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Deployment of a Complete Database: Traditional Approach . . . . . . . . . . . . . 453
Deployment of Individual Objects . . . . . . . . . . . . . . . . . . . . . . . . . . 455

Chapter 12 Stored Procedures for Web Search Engines . . . . . . . . . . . . . . . . . 467


Characteristics of the Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
A Simple Solution... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
...and Its Disadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Available Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Result Splitting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Quick Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Advanced Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
xiv SQL Server 2000 Stored Procedure & XML Programming

Chapter 13 Introduction to XML for Database Developers . . . . . . . . . . . . . . . 489


XML (R)evolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Introduction to Markup Languages . . . . . . . . . . . . . . . . . . . . . . . . . 492
Building Blocks of Markup Languages . . . . . . . . . . . . . . . . . . . . . . . . 492
XML Elements and Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Processing Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Document Type Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
XML Comments and CDATA sections . . . . . . . . . . . . . . . . . . . . . . . . . 496
Character and Entity References . . . . . . . . . . . . . . . . . . . . . . . . . . 497
XML Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Structure of XML Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
XML Parsers and DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
XML Document Quality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
XML Schema and XML Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
XML–Data Reduced (XDR) Schema . . . . . . . . . . . . . . . . . . . . . . . . . 502
XML Schema (XSD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Linking and Querying in XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
XPointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Transforming XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Why XML? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Exchange of Information Between Organizations . . . . . . . . . . . . . . . . . . 524
Information Publishing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526

Chapter 14 Publishing Information Using SQLXML . . . . . . . . . . . . . . . . . . . . 527


For XML Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Auto Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Aggregate Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Computed Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
The Elements Option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
The XMLData Option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
The BINARY Base64 Option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Raw Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
Explicit Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Contents xv

Publishing Database Information Using HTTP . . . . . . . . . . . . . . . . . . . . . . . . 547


Configuring Database Access Through HTTP . . . . . . . . . . . . . . . . . . . . . 548
Accessing Database Information Using a URL . . . . . . . . . . . . . . . . . . . . 552
Troubleshooting Virtual Directories . . . . . . . . . . . . . . . . . . . . . . . . . 554
Executing a Stored Procedure Through HTTP . . . . . . . . . . . . . . . . . . . . 556
Accessing Database Information Using Templates . . . . . . . . . . . . . . . . . . 557
POSTing Queries to the Server . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
XML Views Based on Annotated XDR Schemas . . . . . . . . . . . . . . . . . . . . 571
XML Views Based on Annotated XSD Schemas . . . . . . . . . . . . . . . . . . . . 582
Programmatic Database Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Retrieving XML Data Using SQLXML Managed Classes . . . . . . . . . . . . . . . . 588
Retrieving XML Data Using ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Using SqlCommand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Using DataSet Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Client-Side XML Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Using URL Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Using Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Using SQLXML Managed Classes . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Processing of Queries with the For XML Clause . . . . . . . . . . . . . . . . . . . 602

Chapter 15 Modifying Databases Using SQLXML . . . . . . . . . . . . . . . . . . . . . 605


OpenXML() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
Document Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
Closing the Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Retrieving the XML Information . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
Metaproperties in OpenXML() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
What if an XML Document Is Longer Than 8000 Characters? . . . . . . . . . . . . . 613
UpdateGrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Executing UpdateGrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Element-centric vs. Attribute-centric UpdateGram . . . . . . . . . . . . . . . . . . 619
UpdateGrams with Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Setting Parameters to Null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Returning Identifier Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Special Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
UpdateGrams Behind the Scene . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
Optimistic Locking with UpdateGrams . . . . . . . . . . . . . . . . . . . . . . . . 625
Multiple Records and Multiple Tables in a Single UpdateGram . . . . . . . . . . . . 627
xvi SQL Server 2000 Stored Procedure & XML Programming

DiffGrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Using DiffGrams to Insert Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Using DiffGrams to Update Data . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Using DiffGrams to Delete Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Processing Multiple Records Using DiffGrams . . . . . . . . . . . . . . . . . . . . 634
DiffGrams Behind the Scene . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
Executing DiffGrams Programmatically Using SqlXmlCommand . . . . . . . . . . . 636
Executing DiffGrams Using URLs . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Generating DiffGrams After DataSet Change . . . . . . . . . . . . . . . . . . . . 637
Debugging DiffGrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
SQLXML BulkLoad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Executing SQLXML BulkLoad from a .NET Application . . . . . . . . . . . . . . . . 639
Error Log File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Executing BulkLoad from DTS (Using VBScript) . . . . . . . . . . . . . . . . . . . 641
Schema Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
BulkLoad Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Data Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Table Lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Using SQLXML BulkLoad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Mapping Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
XML Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
SOAP Messages and XML Web Services Architecture . . . . . . . . . . . . . . . . . 647
Using SQLXML to Create XML Web Services . . . . . . . . . . . . . . . . . . . . . 648
Creating .NET SOAP Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650

Appendix T-SQL and XML Data Types in SQL Server 2000 . . . . . . . . . . . . . . 659

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
CHAPTER

Introduction
1
IN THIS CHAPTER:
Who Should Read This Book
What You Will Find in This Book
Requirements
Sample Database and Other Resources

1
2 SQL Server 2000 Stored Procedure & XML Programming

W elcome to SQL Server 2000 Stored Procedure & XML Programming.


This book identifies and describes the key concepts, tips and techniques,
and best practices the professional developer needs to master in order to
take full advantage of stored procedures in the SQL Server development environment.
Microsoft SQL Server is the relational database management system (RDBMS)
of choice for a growing number of business organizations and professional database
and application developers. The reasons for this growing popularity are quite simple:

 Integration No other RDBMS integrates as fully and cleanly with applications


and integrated development environments (IDEs) designed to run on the ubiquitous
Microsoft Windows platform.
 Ease of use SQL Server provides Enterprise Manager and Query Analyzer to
allow DBAs to design, develop, deploy, and manage database solutions. These
interfaces automate repetitive tasks and provide simple ways to perform complex
operations. SQL Server integrates seamlessly with development tools such as
Visual Basic and Visual Interdev to allow developers to design and develop
client/server or Internet solutions rapidly.
 Flexibility You can use different features within SQL Server to achieve
similar results. (Of course, with flexibility comes choice, and choice means
that the developer is responsible for choosing the most appropriate means of
achieving an end. This book will help you make those choices.)
 Power SQL Server makes large amounts of data available to large numbers
of concurrent users while maintaining the security and integrity of the data. At
the time of this writing, SQL Server holds the record in TPC-C benchmark
tests for performance and price/performance (see www.tpc.org).

When I began working with SQL Server, reference materials relating to the
development and deployment of stored procedures were rare and not particularly
helpful. These materials described basic concepts, but the examples presented were
often trivial and not complex enough to be applied to real-world situations in which
aspects such as error handling, debugging, naming conventions, and interfaces to other
applications are critical. As the legions of application developers and development
DBAs migrate from Microsoft Access to SQL Server, and as SQL Server becomes
the leading database for mission-critical application development, the need for more
advanced work on SQL Server stored procedures becomes even more critical.
Chapter 1: Introduction 3

Who Should Read This Book


This book has been written to fill this gap, and thus it has been written with a wide
audience in mind. Ideally, it will be neither the first nor the last book you read on SQL
Server, but it may be the one you refer to and recommend the most. Above all, this book
has been written to help professional developers get the most out of SQL Server stored
procedures and SQLXML extensions and to produce quality work for their clients.
If you are an experienced SQL Server developer, you will find this book to be an
essential reference text full of tips and techniques to help you address the development
issues you encounter in the course of your day-to-day development activities.
If you have some experience with SQL Server development, but substantially more in
other programming environments such as Visual Basic, you will find this book useful as
a tool to orient yourself with the SQL Server environment and become proficient more
quickly with SQL Server stored procedure and SQLXML concepts and methods. You
will be able to incorporate effective, swift stored procedures into Visual Basic code and
SQLXML methods and queries into your client Windows or web applications.
If you are a novice SQL Server developer, the concepts, tips, and techniques you
will learn in reading this book and working through the exercises will help you attain
the knowledge, skills, and good habits that will help you become an accomplished
professional.
I hope that this book remains close to your workstation for a long time. Indeed, in the
course of this book’s useful life, you may in turn be all three of the users just described.

What You Will Find in This Book


Each chapter in this book (aside from the one you are reading, which is introductory
in nature) will provide conceptual grounding in a specific area of the SQL Server
development landscape. The first 12 chapters are dedicated to stored procedure
programming, and Chapters 13, 14, and 15 are focused on XML programming on
SQL Server 2000.
As you may have gathered, this chapter describes the content of this book, as well
as its intended audience, and describes a sample database that we will use throughout
the book to demonstrate stored procedure development.
Chapter 2, “The SQL Server Environment,” provides a 30,000-foot overview of
the Transact-SQL language, SQL Server tools, and stored procedure design.
Chapter 3, “Stored Procedure Design Concepts,” explores SQL Server stored
procedure design in greater detail, with particular attention paid to the different
types of stored procedures, their uses, and their functionality.
4 SQL Server 2000 Stored Procedure & XML Programming

Chapter 4, “Basic Transact-SQL Programming Constructs,” describes Transact- SQL,


the ANSI SQL-92–compliant programming language used to write scripts in SQL
Server. This chapter summarizes data types, variables, flow control statements, and
cursors in the context of SQL Server 2000.
Chapter 5, “Functions,” describes the extensive set of built-in functions available
in SQL Server 2000 and how to use them in various common situations.
Chapter 6, “Composite Transact-SQL Constructs: Batches, Scripts, and Transactions,”
describes the various ways in which you can group Transact-SQL statements for
execution.
Chapter 7, “Debugging and Error Handling,” provides a coherent approach to the
identification and resolution of defects in code and a coherent strategy for handling
errors as they occur.
Chapter 8, “Special Types of Procedures,” describes user-defined, system, extended,
temporary, global temporary, and remote stored procedures as well as other types of
procedures in Transact-SQL, such as user-defined functions, table-valued user-defined
functions, After triggers, Instead-of triggers, standard SQL views, indexed views,
INFORMATION_SCHEMA views, and local and distributed partitioned views.
Chapter 9, “Advanced Stored Procedure Programming,” introduces some advanced
techniques for coding stored procedures, such as dynamically constructed queries,
optimistic locking using timestamps, and nested stored procedures.
Chapter 10, “Interaction with the SQL Server Environment,” focuses on the ways
in which you can use system and extended stored procedures to interact with the SQL
Server environment, and discusses the ways in which user-defined stored procedures
can help you leverage the existing functionality of various elements within the SQL
Server environment.
Chapter 11, “Source Code Management and Database Deployment,” demonstrates
how you can manage and deploy Transact-SQL source code from development to
the test and production environment. It explains and demonstrates two alternative
approaches—one using Visual Studio .NET and the other, more traditional, using
scripts developed in Transact-SQL and VBScript.
Chapter 12, “Stored Procedures for Web Search Engines,” presents an example of
how to use stored procedures in a web application that queries the database system.
Several optimization techniques are used to avoid typical design problems and improve
the performance.
Chapter 13, “Introduction to XML for Database Developers,” introduces XML as
the markup language for information exchange and publishing, and then focuses on
complementary features and technologies like DTDs, XML Schemas, and XPath as
they are used in SQL Server 2000.
Chapter 14, “Publishing Information Using SQLXML,” describes methods for
returning an XML stream instead of a recordset from SQL Server 2000.
Chapter 1: Introduction 5

Chapter 15, “Modifying Databases Using SQLXML,” describes several methods


for parsing XML and updating database tables.
The appendix, “T-SQL and XML Data Types in SQL Server 2000,” provides you
with tables that list data types in use in SQL Server 2000 and the way they map.

Requirements
To make full use of this book, you will need access to a server running one of the
following versions of SQL Server 2000 or SQL Server 2000 (64-bit):

 Enterprise Edition Supports all features and scales to enterprise level;


supports up to 32 CPUs and 64GB RAM
 Standard Edition Scales to the level of departmental or workgroup servers;
supports up to four CPUs and 2GB RAM
 Evaluation Edition Supports all features of Enterprise Edition; use is limited
to 120 days; available for download over the Web

Stored Procedure Programming Requirements


You can also perform most of the stored procedure programming–oriented activities
described in this book using a stand-alone PC with Windows 98, Windows 2000, or
Windows NT Workstation to run one of the following versions of Microsoft SQL
Server 2000:

 Personal Edition Designed for mobile or stand-alone users and applications;


does not support some advanced features, such as fail-over clustering, publishing
of transactional replications, OLAP Server, or Full Text Search; supports up to
two CPUs
 Developer Edition Licensed to be used only as a development and test
server, although it supports all features of Enterprise Edition
 Desktop Engine Distributable but stripped-down version that software
vendors can package and deploy with their systems; part of Microsoft Access
and Visual Studio; also known as MSDE; does not contain administrative tools
such as Enterprise Manager, Query Analyzer, and Books Online; does not
support advanced features such as Analysis Services and replication; database
size is limited to 2GB
6 SQL Server 2000 Stored Procedure & XML Programming

Although MSDE is compatible with all other versions of SQL Server 2000 and
thus makes an excellent development tool in a stand-alone environment, the absence
of administrative tools such as Enterprise Manager and Query Analyzer means that
some of the information you find in this book will not be usable right away. I recommend
that you obtain some other version (such as Developer Edition or Evaluation Edition),
or at least buy a Server/Per-Seat Client Access License (CAL) that will allow you to
use administrative tools against MSDE.

XML Programming Requirements


To explore and use XML programming features, you need to install and use:

 XML for SQL Server Web release (SQLXML) I recommend that you
download and install at least SQLXML 3.0, Service Pack 1.
 Microsoft SOAP Toolkit Download version 2, Service Pack 2 or newer.
 Microsoft XML Core Services (MSXML) Use version 4, Service Pack 1 or
newer. Earlier versions were called Microsoft XML Parser.
 Internet Information Services (IIS) Use version 5 or newer.
 Internet Explorer Use version 5 or newer.

Sample Database and Other Resources


You may have noticed that this book does not include a CD. SQL Server development
is a dynamic field, as you will see if you compare the first and second editions of this
book. Rather than increase the cost of the book by adding a CD, which would be out
of date almost before it hits the bookstore, the publisher and I have chosen to make
additional resources available for download via the Web. In addition to the sample
database (more information on that in just a bit) that I have created and will use
through most of this book, other resources available include:

 Several tools for source code management and database deployment Set
of T-SQL, VBScript and .NET tools for generating, managing, and deploying
code of database objects.
 Sample SQLXML code Visual Studio .NET sample projects for demonstrating
use of SQLXML managed classes.
Chapter 1: Introduction 7

 Periodic updates As noted earlier, SQL Server development is a dynamic


field, and thus a book on SQL Server needs to be dynamic to meet the evolving
needs of its audience. Reader feedback is important to me. Check my web site
(www.trigonblue.com) for periodic updates on issues raised by readers.
 Author’s web site Aside from being the source of the sample database
and periodic update downloads, the Trigon Blue web site provides a wealth of
excellent reference materials and links. Visit the site often for SQL Server and
e-business news. While you’re there, have a look at the many articles and white
papers, and check out Trigon Blue’s many product and service offerings.

The subject of the Asset sample database created for this book is an asset
management system within a fictional organization. Although the database is
based on real-world experience within financial institutions, it is also applicable
in many other environments.
The main purpose of the database is to track assets. Assets are defined as equipment,
and all variations in their content, attributes, and shape are recorded as values of
properties. The Inventory table tracks location, status, leasing information, and who
is currently using each asset. To transfer an asset from one location to another, to
assign assets to a different owner or department, to request maintenance, or to request
upgrades or new assets, users of the database use orders and order items. Activities
performed to complete the order are recorded in the charge log and interdepartment
invoices are generated. There are lookup tables used to track provinces, lease
frequencies, statuses, and other details.

Sample Database Installation


You should download this database and install it on your server before you begin to
read the rest of this book. To download and install the sample Asset database:

1. Visit www.trigonblue.com/sqlxml
2. Click the Download Sample DB link.
3. Click the Asset sample database link to start the download. When prompted,
opt to save the file to disk. Remember the location to which you saved the file.
4. Unzip the contents of the Zip file into the Data folder of the machine on
which SQL Server is installed (usually \Program Files\Microsoft SQL
Server\MSSQL\Data).
8 SQL Server 2000 Stored Procedure & XML Programming

5. Make sure that SQL Server is running. If necessary, run SQL Server Service
Manager from Programs | MS SQL Server or use the system tray icon. If
necessary, start the SQL Server service.

6. Run Query Analyzer (select Programs | MS SQL Server | Query Analyzer).


7. You will be prompted to connect to SQL Server. Type the server name and log
in as system administrator (sa). If the password has not been set, leave the
password blank (an empty string).

Query Analyzer opens a query window pointing to the master database.


Random documents with unrelated
content Scribd suggests to you:
La fillette se rebiffa.
—Jamais de la vie, par exemple!
Deber déclara légèrement:
—Du tout, elle m'attendra. Si elle est devenue un ange, je
l'épouserai.
Laumière rit.
—Je ne vois pas Cady en femme mariée! D'ailleurs, j'ai un droit de
priorité que je réclame.
Cady lança impétueusement:
—Oh! c'est toi, Jacques, que je ne vois pas marié, et surtout avec
moi! Tu seras mon amant, si tu veux, mais pas mon mari, je t'en
réponds!
—Patatras! s'écria Laumière. Il y avait trop longtemps que Cady était
sage! Il lui fallait bien commettre une incongruité!
Deber haussa les épaules et se leva, visiblement contrarié.
—C'est une pauvre enfant déplorablement élevée! dit-il en
s'éloignant.
Cady salua son dos avec une révérence comique.
—Va donc! vieux barbant!
Et, revenant à Jacques, elle entrelaça ses doigts à ceux du peintre,
le regardant dans les yeux.
—Tu veux de moi, demain, pour poser? dit-elle bas, ardemment.
Il l'étudia, un rien troublé, comprenant qu'elle ne parlait point du
portrait officiel presque terminé et dont le peintre faisait traîner
volontairement les dernières séances; mais bien du tableau pour
lequel, une seule fois, elle avait livré son corps nu, audacieusement.
—Oui, je veux de toi, répondit-il bas aussi, les yeux attachés sur la
grâce de cette fillette, dont il se rappelait la beauté avec un
mystérieux frisson intime.
XXII
—Vous vous couchez, Cady? demanda Mlle Armande avec un
bâillement, en se retournant dans son lit.
—Oui, mademoiselle, tout de suite, répondit la fillette avec une
exemplaire docilité.
Pourtant, malgré cette promesse, elle se garda de quitter sa lecture
et demeura immobile, patiemment, guettant le prompt sommeil qui
vint tomber sur son institutrice.
Quand la respiration régulière et un peu sifflante de celle-ci lui apprit
que Mlle Armande était profondément assoupie, elle se leva et sortit
doucement de la chambre.
Les domestiques étaient partis de bonne heure, les patrons dînant
en ville. Cady s'assura que Baby et sa gouvernante dormaient dans
leur appartement, et elle se dirigea vers la porte de service, qu'elle
ouvrit avec le passe-partout qui demeurait pendu dans l'office.
Elle traversa le palier et vint gratter à la porte en face avec
précaution.
Au second signal, le battant s'ouvrit sans bruit, et le petit Georges
parut, tirant la porte derrière lui.
—Tu es seule? demanda-t-il d'une voix mesurée.
—Oui, viens!
Les deux enfants rentrèrent dans l'appartement à pas de loup,
retenant leur souffle, un peu émus par le mystère de l'obscurité et
du silence.
—Veux-tu que j'allume l'électricité? proposa Cady.
Georges se récria.
—Tu es pas maboul?... Pour faire venir du monde!
—On va se cogner, objecta la fillette qui se sentait mal à l'aise dans
ces ténèbres.
—Pas de danger!... Et puis, on peut tout de même un peu éclairer...
Tiens, regarde...
Le garçonnet tira de sa poche une minuscule lampe électrique, dont
la lueur dissipa faiblement la nuit qui les enveloppait.
—On se dirait dans du brouillard! admira Cady.
—Où sommes-nous?
—Dans la salle à manger.
Il questionna avec vivacité.
—Il reste du dessert?
—Je pense... Il y avait des gens à déjeuner; alors c'était chic.
—Où le met-on?
—Ici, dans le meuble d'encoignure.
Le petit garçon découvrit avec une vive satisfaction des amandes
fraîches, des cerises déguisées, des biscuits.
—Donne ta robe... On va emporter une provision et nous la
mangerons à notre aise. Où sera-t-on bien?
Cady réfléchit.
—Dans le cabinet de papa... Passe par là, moi je vais à l'office voir
s'il reste du champagne.
Lorsque Cady revint, Georges était blotti parmi les coussins du
divan; et, son délicieux visage blanc et blond penché sous la petite
lueur électrique, il s'occupait de grouper coquettement les friandises
grappillées.
—Tu as du champagne?
—Une bouteille entière. Tu sauras la déboucher?
—Tu parles! C'est Paul qui m'a montré.
—Qu'est-ce qu'il devient, Paul?
Le garçonnet hocha la tête.
—Il fout des coups à maman.
—Vraiment? s'écria Cady intéressée. Et pourquoi cela?
Georges fit un geste soucieux.
—A cause du pognon.
—Quel pognon?
—Ben, celui de maman... ça ne va pas fort de ce moment, on est
dans la purée, et alors, tu comprends, ça embête Paul.
Accroupie à la turque sur le divan, Cady croqua l'amande épluchée
que Georges lui mettait dans la bouche.
—En somme, remarqua-t-elle posément, Paul, c'est son souteneur, à
ta mère?
—Mais non, voyons, tu ne sais pas comment tu parles! Les
souteneurs, c'est ceux des pierreuses... Maman est une femme
comme il faut... Paul, c'est son ami.
—Tout de même, elle lui donne de l'argent.
—Bien sûr, mais c'est parce qu'elle l'aime et qu'il est bien gentil pour
elle... et, des fois, si rigolo!...
Cady balança la tête.
—Il l'aime, et il la cogne!
—Ça n'empêche pas!... Et puis, tu sais bien, il est très endurant, et
ce n'est que quand elle fait trop la vache qu'elle prend quelque
chose.
Se rapprochant de Georges dont elle caressait doucement les
boucles soyeuses, Cady demanda, pensive:
—Qu'est-ce que tu appelles faire la vache?
—Eh bien, elle dit qu'elle est fatiguée, que ça la barbe, et elle refuse
carrément les occasions.
—Quelles occasions?
Georges s'impatienta.
—Ah! tu es trop gourde, on ne peut pas causer avec toi!... Tu ne
comprends rien!... Alors, qu'est-ce qu'on t'apprend?
Cady se rebiffa, piquée.
—Tiens, je peux bien te demander, peut-être!... Ma mère à moi n'est
pas une cocotte!...
Il riposta promptement:
—Ça ne l'empêche pas d'être une...!
Cady ne broncha pas devant le mot grossier qui lui était connu,
faisant partie du vocabulaire usuel de l'office.
—Et puis après? dit-elle tranquillement. Ce n'est tout de même pas
la même chose que ta mère. Elle a un mari, et elle ne demande pas
d'argent aux hommes, ni elle n'en donne non plus.
Georges cracha trois noyaux de cerises et déclara avec conviction:
—Alors, c'est qu'elle est une sale bête sans cœur, et qu'elle est trop
vieille ou trop moche pour savoir travailler... sans quoi, elle ferait
comme les autres femmes.
Cady se scandalisa.
—Georges! petit sale!... ne crache pas tes noyaux sur le tapis...
Demain, on les verra, et c'est moi qui écoperai!...
—Où faut-il les envoyer?
—Dans le fond du divan... Y a pas de danger que Valentin les
découvre, il ne brosse jamais les meubles... Donne, je sais comment
fourrer la main.
Georges lui passa des débris divers: coques d'amandes, papier
plissé, noyaux, miettes.
—Tiens!...
Quand la fillette se redressa, il l'enlaça tendrement et l'embrassa
longuement dans le cou.
—Si tu veux, quand nous serons grands, je serai ton Paul... Tu
voudras? dis... Mais, dis donc!...
Cady rit, caressant de ses lèvres le visage du petit garçon...
—Merci!... je ne donnerai pas d'argent aux hommes, moi, je t'en
réponds, c'est trop bête!
Il répondit naïvement:
—Tu n'en donneras pas aux autres, bien sûr... Mais à moi, si tu
m'aimes beaucoup, ça te fera plaisir. Du reste, tu sais, j'en aurai de
l'argent à moi.
—Comment cela?
—J'en gagnerai comme Paul.
—Il gagne de l'argent, Paul?
—Certainement.
—En faisant quoi?
—D'abord, il joue aux courses.
Cady haussa les épaules et prononça d'un air entendu:
—Les courses!... On s'y fait enfiler plus souvent qu'on n'y rafle du
pognon...
—Des fois, on a la veine. Et puis, Paul joue aussi dans les cercles...
Et là, il gagne toujours.
—Il triche, alors?
—Pour sûr!... Tu ne voudrais pas qu'il soit assez poire pour laisser
faire le coup aux autres!...
—Comment est-ce qu'il triche?
—Oh! il y a bien des façons. Ça dépend du jeu, et puis des pontes,
et puis de l'endroit... Des fois, il triche à la mise, ou à la retourne, ou
c'est la carte filée, ou bien il fait la séquence, mais, pour cela, il faut
des copains, et puis surtout une boîte où on ne soit pas sur l'œil.
Cady hocha la tête en riant.
—Tu as l'air bien calé, toi!... Il te montre les coups?
—Oh! je suis déjà adroit! Tu n'as pas de cartons?
—Si, dans la table de bridge.
Le garçonnet sauta sur ses pieds, s'empara d'un jeu de cartes, le
battit, l'étala et expliqua:
—Je suppose que nous jouons à l'écarté. C'est l'autre qui fait... Tu
laisses courir la chance, si elle est pour toi, tant mieux; si elle est
contre toi, tant pis, c'est pas mortel... La main te vient ensuite, et tu
es sûr de te remonter... Quand tu ramasses les cartes, une
supposition que tu voies un roi... Tu le saques et puis, tu fais courir
derrière toute sa couleur... Au moment où tu présentes à la coupe,
c'est ton affaire que ton tas y se trouve dessus... En relevant, tu
détruis comme de juste la coupe, à l'invisible; mais, comme il ne
faudrait pas que tu n'aies que de l'atout et que tu ne dois pas non
plus en envoyer à ton adversaire, tu distribues en faisant glisser le
dessous pour le ponte et le dessus pour toi, à l'excepte d'une ou
deux cartes que tu t'envoies au hasard.
Cady opina, admirative:
—Ça doit être joliment difficile!
—Ah! il ne faut pas avoir les doigts nickelés!... Tiens, je vais te
montrer la conduite.
Et le petit garçon battit, tripota les cartes, fit couper, distribua et
étala les deux mains retournées sur le tapis, faisant remarquer,
triomphant:
—Tu vois... J'ai le roi d'atout, la dame, le dix et un sept... Toi, tu n'as
que l'as seulement et des bûches. Tu n'as pas vu comment je faisais,
hein? C'est richement exécuté, pas?
Cady sourit dédaigneusement.
—Pardi, il fait presque noir!...
Georges piqué, courut à l'électricité qu'il fit jaillir.
—Eh bien, recommençons!...
Cette fois, penchée et attentive, Cady l'arrêta avec un cri.
—Là, entre tes doigts!... J'ai vu que tu retenais une carte!...
—Tu as vu?
—Oui, j'ai vu.
—C'est pas vrai!
—Si, c'est vrai! C'était une dame de pique.
Dépité, le garçonnet jeta le paquet de cartes sur la table, grimaça
piteusement et se mit à sangloter.
—C'est parce que j'ai la main trop petite! balbutia-t-il avec
désolation. Mais Paul a dit que, plus tard, je serai encore plus adroit
que lui!...
Cady l'attira sur sa poitrine.
—Petit idiot, fit-elle tendrement, ne pleure pas.
Et comme les larmes ne tarissaient pas dans les grands yeux bleus
éplorés de l'enfant, pour le distraire, elle le mena devant le bureau,
frappant du doigt sur un tiroir.
—Regarde, c'est là-dedans que se trouve le diamant dans sa gangue
dont je t'ai parlé.
Les yeux de Georges flambèrent soudain séchés.
—Oh! le diamant? s'écria-t-il avec avidité. Fais voir!
Cady rit.
—Mais, je n'ai pas la clef du meuble, tu penses!
Georges se pencha pour étudier la serrure.
—Tu es bien sûre que c'est là?
—Très sûre.
Le petit garçon se redressa, avec un rire sournois.
—Toi aussi, Cady, tu voudrais le voir le diamant?
—Evidemment.
Georges fouilla dans sa poche, et en tira un petit outil de fer qu'il
engagea dans la serrure, d'un geste prompt, avec un coup d'œil
méfiant autour de lui.
—Que fais-tu? s'écria Cady, interloquée.
L'autre ne répondit pas, tournant, poussant son crochet; une ride
profonde se creusait dans son front délicat, tandis que ses petites
mains se crispaient sur l'instrument, pesant dessus de toutes leurs
forces.
Enfin, il poussa un soupir de satisfaction, et ramena le tiroir ouvert.
—Ça y est, sans douleur! s'écria-t-il d'une voix à la fois enfantine et
canaille, en brandissant son crochet avec triomphe.
Cady le considérait avec un mélange de stupeur, d'effroi et
d'admiration.
Il ne s'occupait guère des impressions de son amie et la questionnait
âprement:
—Où est-il, le diamant? Cherche, toi... Moi, je ne veux rien
bousculer, ça se verrait.
A l'idée de toucher de nouveau la précieuse pierre, pour laquelle elle
ressentait une si grande curiosité, toute circonspection, toute
réflexion s'enfuit du cerveau de Cady. Elle se précipita, fébrile, les
mains tremblantes, et se saisit de la pierre grisâtre.
—C'est seulement ça? s'écria le garçonnet déçu.
Cady expliqua:
—Tu vois bien que ce qui est laid, c'est une enveloppe... Le diamant
est à l'intérieur... Il est très beau... Papa a dit à Maurice Deber que
c'était un magnifique cadeau. Et, tu sais, papa y ne se frappe pas
pour rien.
Georges reprenait de l'intérêt pour l'objet.
—Donne, fit-il.
Et il le tourna, le palpa, le gratta longuement.
—Tu vas l'user! plaisanta Cady.
Il fit le geste de le glisser dans sa poche. Et, penchant la tête
coquettement, il demanda avec une supplication câline:
—Cady, donne-le-moi?
La jeune fille haussa les épaules.
—Tu es fou!
—Je t'en prie!...
—Mais je ne peux pas te le donner; il est à papa, il n'est pas à moi.
Le gamin fourra le diamant audacieusement dans sa veste.
—Alors, ma chérie, s'il n'est pas à toi, ça m'est bien égal, je le
prends!
Un afflux de sang empourpra subitement les joues de Cady. Elle
fondit menaçante sur l'enfant.
—Rends le diamant de papa, tout de suite!
L'enfant, intimidé, céda, jetant la pierre à travers la chambre.
—Va donc le chercher, sale rosse! cria-t-il rageusement.
Sans mot dire, Cady ramassa le diamant, le remit dans le tiroir, et
ordonna, la voix brève:
—Referme!...
Georges se détourna, maussade.
—Je ne peux pas.
Elle repoussa le tiroir.
—Alors, tant pis... Y se débrouilleront comme ils voudront!
Puis, revenant vers son ami, les mains derrière le dos, elle le
contempla longuement; et elle déclara, la voix apaisée:
—Tu n'es tout de même qu'un sale petit cambrioleur.
Georges éclata de rire, sa rancune envolée.
—Tu es bête, Cady!
Et l'enlaçant, il l'attira près de lui sur le divan.
—Il y a encore des amandes, tu sais?
Mais elle repoussa doucement les baisers du petit, ainsi que les fruits
que, du bout de ses lèvres, il cherchait à glisser entre les dents de
son amie. Préoccupée, elle demanda:
—Qui t'a donné cet outil?
—Personne.
—Qui t'a appris à t'en servir?
—Personne.
—Ne mens pas!...
Il certifia:
—Je te le jure!... Je l'ai trouvé un jour dans la chambre de maman,
je l'ai essayé dans les serrures, et je l'ai gardé pour quand je voulais
des choses qu'on ne me donne pas ou des sous.
D'un geste brusque, Cady enveloppa le cou de l'enfant de ses deux
mains, faisant mine de serrer.
—Hein! si je t'étranglais, méchante petite bête? Ça ne serait pas un
grand dommage!
Il se tordit en riant sous l'étreinte, tendant ses lèvres.
—Bah! tu m'aimes trop pour me tuer!... N'est-ce pas que tu
m'aimes, Cady?
Elle le lâcha et, se penchant, l'embrassa longuement.
—Oui, je t'aime...
Il recommençait ses projets d'avenir.
—Quand nous serons grands, nous nous mettrons ensemble et nous
voyagerons... A l'étranger, vois-tu, on fait fortune...
Elle l'interrompit.
—Moi, j'aimerais habiter en Italie, en Afrique, où il y a du soleil.
—Bien sûr, c'est les plus chics pays... Pourtant, y a la Russie. Tous
les hommes sont millionnaires et ils aiment le champagne et les
femmes, tu n'as pas idée...
Mais, soudain, un léger bruit les fit sursauter.
—Nom de Dieu, v'là du monde! fit Georges sourdement. Eteins vite,
Cady!
La fillette se précipita sur l'électricité, et, dans les ténèbres, les deux
enfants galopèrent sans bruit, se tenant serrés par un bras et l'autre
étendu pour se garer des heurts.
Dans le corridor, Georges, tout haletant d'effroi, murmura:
—Je me barre?
—Pour sûr!... Vite!
Et le garçonnet ayant filé par la porte de service, Cady, arrachant ses
vêtements en hâte, se jeta dans sa couchette et s'enterra sous ses
couvertures, avec un soupir de soulagement.
Mlle Armande vira dans son lit, soupira, se retourna encore, ainsi
qu'un cachalot échoué, et ne bougea plus.
De nouveau, le silence, la paix s'établirent dans la chambre.
XXIII
Ce dimanche-là, les trois cousines, réunies chez Mme Serveroy,
boulevard Latour-Maubourg, ne devaient pas sortir, Marie-Annette se
plaignant d'un fort mal de gorge.
Aussi, dès que les jeunes filles furent installées devant le maigre feu
de la chambre, les institutrices s'empressèrent-elles de prendre leur
volée.
Immédiatement, la scène changea. Marie-Annette jeta le foulard et
la ouate enveloppant son cou, se débarrassa de son peignoir et vêtit
rapidement un costume de ville.
—Sapristi, mes bottines ne sont pas faites!... Tant pis, je vais les
frotter avec mon mouchoir!
Cady l'assistait en riant, tandis qu'Alice qui n'était pas de l'escapade
projetée, se désintéressait, boudeuse et sarcastique.
—Bonne chance! cria-t-elle avec jalousie derrière les jeunes filles qui
dégringolaient l'escalier de service, afin de sortir par la petite porte
que ne surveillait aucun domestique.
Sur le boulevard presque désert, un fiacre attendait, trois maisons
plus loin.
—C'est lui? demanda Cady.
—Je pense!... Oh! ma chère, mon cœur bat!
Cady étouffa un violent éclat de rire, car pendant que sa cousine
parlait, elle avait eu une de ces convulsions du visage qui lui étaient
familières. A l'idée du singulier spectacle que devait donner Marie-
Anne amoureuse et grimaçant des paroles tendres, la fillette sentait
les spasmes d'une folle gaîté la submerger.
—Si son type est seulement moitié aussi loufoque qu'elle, ce ne sera
pas banal! pensait-elle.
Marie-Annette la bousculait.
—Oui, oui, c'est lui!...
Elles coururent au fiacre, ouvrirent la portière et se précipitèrent
dedans.
—C'est nous! annonça Marie-Annette, tandis que Cady, renversée au
fond de la voiture, riait de tout son cœur réjoui par l'irrésistible
comique de la scène.
Leur double entrée en tempête avait fait se tapir burlesquement
dans un angle un individu au long corps maigre. Il les examinait,
péniblement recroquevillé, avec une intense et risible expression
d'ahurissement. Ses petits yeux noirs disparaissaient dans la
bouffissure d'une large face enfantine, toute mangée de grosse
barbe noire, et un minuscule nez pointu, relevé à l'extrémité, saillait
en piton au milieu de pommettes rouges et luisantes.
—Eh bien, c'est nous, répéta Marie-Annette, un peu énervée par son
silence et dépitée par son attitude grotesque. Est-ce que vous ne me
reconnaissez pas?
Le jeune homme fit un grand geste maladroit, protestant:
—Oh! pouvez-vous dire!... Mais je ne m'attendais pas...
—A ma présence, à moi? glissa Cady en l'examinant effrontément...
Non, mais, mon garçon, vous n'imaginez pas que ma cousine serait
venue toute seule à votre rendez-vous?
Il s'excusa, démonté.
—Mademoiselle, soyez sûre que... mon respect...
Le cocher se penchait.
—On va?
—Ah! oui, au fait, où allons-nous? s'écria le jeune homme de plus en
plus éperdu.
Marie-Annette se taisait, la figure calme, jolie, au fond de la voiture,
où elle se rencoignait, un peu émue des suites de l'aventure dans
laquelle elle s'était inconsidérément engagée.
Cady lança avec décision:
—Eh bien! chez vous!... n'est-ce pas convenu?
Il bégaya des mots incompréhensibles, hésita, s'agita; puis, prenant
un parti, pencha son buste dans la portière ouverte:
—Rue Vaneau, 140!
La secousse régulière du fiacre, l'immobilité de ses compagnes
finirent par le remettre.
Il prit la main de Marie-Annette.
—Combien je vous suis reconnaissant!
Cady l'interrompit.
—Dites donc! si l'on faisait les présentations.
Marie-Annette se redressa.
—M. Jules Desfossés, avocat... Ma cousine Cady, la fille de mon
oncle Darquet!
Le jeune homme jeta avec vivacité:
—Ah! c'est vous, la fille de l'éminent député?...
Cady étudiait le corps gauche, la mine intimidée de l'individu.
—Vous plaidez, vous? fit-elle avec incrédulité.
—Oui... c'est-à-dire pas beaucoup encore... Je suis secrétaire de la
rédaction d'un journal judiciaire.
Marie-Annette continuait, souriant à des ressouvenirs:
—Voici plus de six mois que nous nous connaissons... Du moins, que
nous nous rencontrons presque tous les jours dans la rue de
Vaugirard...
—Par hasard, c'est prodigieux! remarqua Cady avec ironie.
Le jeune homme expliqua:
—Je fréquente un cabinet de lecture au 170.
Marie-Annette poursuivit:
—Qui est précisément au rez-de-chaussée de la maison où est notre
cours. Une fois, sous le porche, on s'est parlé... on s'est écrit... et
puis...
Jules lui prit la main avec une apparence de sincérité tendre qui
surprit Cady.
—Enfin, vous avez bien voulu consentir à venir me voir aujourd'hui
pour que nous causions de notre avenir. Vous avez eu confiance en
moi, chère Annette... Croyez que j'en suis bien heureux!
Le tour sentimental de l'aventure stupéfiait Cady.
Elle ne comprenait le flirt qu'ainsi qu'une sorte d'escarmouche rapide
et légère, où la femme pique la curiosité de son partenaire, harcèle
son désir et s'enfuit tout à coup avec un rire insouciant, l'esprit
distrait par un jeu et un but nouveaux.
—Ils sont fous, pensa-t-elle.
Et elle s'intéressa subitement au mouvement des rues noires et
étroites que le fiacre longeait, oubliant ses compagnons qui
l'ennuyaient.
On s'arrêta.
—Alors, fit Cady maussade, nous entrons chez vous?... Y a-t-il, au
moins, quelque chose à manger?
—Oui... c'est-à-dire, non dit le jeune homme embarrassé.
—Oui, non, enfin, quoi? faudrait s'entendre! jeta Cady, mécontente
et péremptoire.
—Il y a du thé et des gâteaux secs, murmura le jeune homme,
anéanti par cet interrogatoire sans bienveillance.
Cady fit la grimace.
—Ça ne suffit pas... Les gâteaux secs c'est toujours trop mou...
—Voyons, Cady, intervint Marie-Annette, gênée par sa désinvolture.
—Ah! ta bouche! s'écria Cady révoltée. Crois-tu que je m'amuse? Au
moins que j'aie de bonnes choses à manger! Tenez, m'sieu l'avocat,
voilà ce que nous allons faire. Donnez-moi votre clef, expliquez-moi
où est votre caserne, et, pendant que nous nous installerons, jouez
des quilles jusqu'à la prochaine pâtisserie, et revenez vite avec une
bonne provision.
—Mais, je vais d'abord vous conduire...
—Du tout! Ça n'en finirait pas... Croyez-vous que nous resterons ici
jusqu'à demain? Allons, la clef, et filez!...
Le jeune homme se soumit, dompté par l'entrain et l'entêtement de
la fillette.
—Eh bien, voici mon trousseau... Le passe-partout, c'est la plus
grande clef... L'appartement est à l'entresol, à gauche... Cinq
minutes et je serai revenu, le pâtissier est tout près.
Cady haussa les épaules avec un blâme.
—Et vous n'aviez pas pensé à vous approvisionner?... Si c'est pas
malheureux!...
Marie-Annette, émue de la mortification de son ami, jeta avec une
contorsion de tout son visage.
—Tais-toi donc, Cady, on ne venait pas pour manger!
Cady la poussa d'un coup de poing dans l'escalier.
—Tu dis, petite brute?...
Et, hors de portée des oreilles de Jules Desfossés, elle ajouta:
—Alors, quoi, tu lui avoues que tu venais pour faire l'amour?... Tu
n'as pas la trouille, ma vieille! Alors, pourquoi que tu m'amènes?...
Tu ne penses tout de même pas que je m'en vas zyeuter vos
enlacements?...
Marie-Annette se défendait, confuse.
—Cady, tu es insupportable!... Jamais je n'ai eu l'idée!... Tu le sais
bien...
L'autre s'esclaffait en fourrageant dans la serrure.
—C'est tout de même drôle de pénétrer chez un type que l'on ne
connaît pas! C'est surtout pour cela que je l'ai envoyé courir... parce
que, ses gâteaux, j'y tiens pas tant que cela.
—Ah! oui, c'est amusant! s'écria Marie-Annette.
Et toutes deux pénétrèrent en courant comme des folles dans un
couloir sombre encombré de vêtements pendus; puis dans deux
petites pièces, chambre et cabinet de travail, aux vieux meubles
désuets.
Avec un cabinet de toilette noir et une cuisine grande comme un
placard, pleine de chaussures non cirées, de linge sale et de vaisselle
malpropre, c'était tout l'appartement.
—Bigre! c'est pas la turne d'un prince! remarqua Cady, déçue.
Marie-Annette se jeta dans un «voltaire» comme l'on n'en rencontre
plus que rive gauche.
—Que veux-tu, ma chère, je l'aime! s'écria-t-elle d'un air inspiré.
Cady pouffa.
—Et puis?
—Comment, et puis?
—Qu'est-ce que tu en feras?
—Je l'épouserai.
Cady esquissa un cake-walk désordonné.
—Oh! oh! elle l'épousera!
—Pourquoi pas?... Il est très comme il faut, et un avocat, ça arrive à
tout.
—Ce type!... avec sa barbe de marchand de marrons... et son petit
pif, piqué entre deux pommes d'api frottées!... Et Jules qu'il
s'appelle!... Jules! Jules! Jules! glapit Cady au paroxysme de la joie.
A ce moment, on heurta à la porte.
—Tais-toi, c'est lui! s'écria Marie-Annette.
—Eh! laisse-le voir à la porte un moment!... On n'a pas encore assez
regardé, ici.
Et allant au bureau, elle ouvrir les tiroirs délibérément avec une clef
du trousseau qu'elle avait gardé à la main.
—Faut connaître un peu le monde qu'on fréquente, expliqua-t-elle
gravement.
Comme elle feuilletait les papiers, parcourait des lettres, Marie-
Annette se récria, scandalisée:
—Oh! tu ne vas pas lire?
—Non, mais, je me gênerai?... D'abord, pourquoi nous a-t-il confié
ses clefs?
Et s'interrompant tout à coup.
—Tiens, voici justement quelque chose qui paraît intéressant!
Elle lut, haut, avec rapidité:
«Mon cher garçon, tu nous dis à ton père et à moi, que tu n'as plus
d'argent pour finir ton mois. C'est que, en se privant de tout ici, c'est
avec bien de la peine qu'on t'envoie les cent cinquante francs
mensuels qu'on t'a promis. Peut-être que tante Claire consentira à
t'envoyer cinquante francs, seulement, il ne faudra plus compter sur
son cadeau à ta fête de naissance. Mon cher enfant, j'ai bien du
souci de ce que tu me dis. Si ta place au journal ne te rapporte pas
plus que les faux frais où cela t'engage, pourquoi t'y obstiner? Et
puis, au sujet de la personne dont tu me parles, elle me paraît bien
jeune sur son portrait, et c'est le plus vite possible qu'il faudrait
t'établir et tâcher de vivre pour toi-même...»
Cette fois, une série de coups de plus en plus sonores annonçaient
que le maître du logis était bien derrière la porte. Mais Cady acheva
sa lecture, écoutée attentivement par sa cousine.
«C'est plutôt une veuve aisée, encore jeune que je te souhaiterais.
Enfin, prends bien tes informations sur cette jeune fille. Il y a du
vilain monde partout, et surtout à Paris. Avant de t'engager, sois sûr
que la famille est telle que tu dis, et tâche de savoir le chiffre exact
de la succession du père. Je t'embrasse, mon cher garçon, et je
pense à toi nuit et jour.
«Ta mère,

«Louise Desfossés.»
Cady fourra prestement la lettre dans sa poche, referma le tiroir et
courut ouvrir.
—A la bonne heure! s'écria-t-elle avec satisfaction, en apercevant le
volumineux paquet de papier fin dont le jeune homme était chargé.
L'avocat semblait avoir repris son aplomb.
—Avez-vous mis chauffer la bouillotte pour le thé? demanda-t-il en
souriant avec amabilité.
—Ma foi non, répondit Cady, nous étions trop occupées à fouiller
dans vos meubles.
Il n'attacha aucun importance à ces mots et se mit à préparer le thé,
en garçon accoutumé à faire lui-même sa cuisine matinale.
Cady le regardait avec intérêt, Marie-Annette souriait de façon
ambiguë, incertaine de ce qui se passait en elle.
Le thé et les gâteaux servis, les jeunes gens installés, Cady se récria
tout à coup:
—Vrai! pour des amoureux, vous ne parlez guère!...
Le jeune homme se rapprocha de Marie-Annette dont il enlaça la
taille.
—Vous m'intimidez, mademoiselle Cady!
La fillette lança un regard dédaigneux à leur groupe insuffisamment
esthétique.
—Pardi!... parce que vous sentez bien que je ne suis pas gourde,
poire, bouse de veau comme ma cousine!...
Marie-Annette grimaça, furieuse:
—Tu pourrais garder tes appréciations pour toi!...
Le jeune homme prononça sentimentalement:
—Elle est trop jeune pour comprendre notre amour pur, profond...
Avec un rire aigu, Cady tira de sa poche la lettre qu'elle venait de
lire, et recommença à voix haute:
«Mon cher garçon, tu nous dis à ton père et à moi...»
—Cady! protesta Marie-Annette, devenant cramoisie.
Jules avait tressailli, éperdu. Puis il bondit sur la fillette, essayant de
se saisir du papier, qu'elle lui déroba adroitement, en se sauvant au
fond de la pièce.
—Mademoiselle!... je ne supporterai pas!... Comment cette lettre
est-elle entre vos mains?...
Cady poursuivit sa lecture, plus haut, très vite, scandant les mots
impitoyablement.
L'avocat retomba sur son siège, désemparé.
—Cady! tu es odieuse! déclara Marie-Annette en sanglotant derrière
ses mains.
Le nez blême au milieu des pommettes pourpres, le jeune homme
s'écria avec énergie:
—Après tout, que prouve cette lettre?... Que j'ai des idées
sérieuses... Beaucoup de jeunes gens n'auraient vu qu'une aventure
amusante et sans lendemain où j'ai mis tout l'espoir de ma vie!...
Marie-Annette releva la tête, reconquise par cette éloquence.
—Cady? dit-elle avec émotion.
L'autre leva les épaules.
Jules continua avec chaleur, s'adressant à la fillette:
—Oui, mademoiselle, votre indiscrétion que je ne qualifierai pas,
vous a révélé que j'étais pauvre, que j'ai des parents à qui je ne
cache rien de mes pensées et de mes projets, mais cela ne prouve
point que je ne ressente pas une affection sincère pour Mlle
Serveroy.
—Nièce de Cyprien Darquet, ministre demain peut-être, et qui,
orpheline, touchera à ses vingt et un ans la fortune de son père,
remarqua Cady ironiquement. Tout cela est très juste, mon cher
monsieur, et pas mal calculé; seulement, vous oubliez qu'il faudra
sept ans avant que Marie-Annette arrive à sa majorité... Et comme le
dit votre chère maman, c'est bien long!...
Le jeune avocat sursauta.
—Sept ans?
Marie-Annette implora en rougissant.
—Cady! je t'en prie. Tais-toi!
Cady poursuivit, impitoyable:
—Sans doute, sept ans... je sais compter peut-être!... Puisqu'elle n'a
que quatorze ans!...
Jules sauta sur ses pieds.
—Quatorze ans, bon Dieu! gémit-il avec consternation. Marie-
Annette, vous disiez dix-huit!...
Cady éclata de rire.
—Ah! ça vaut le coup!... Dix-huit ans! vous ne voudriez pas, mon
empereur!... Nous sommes des gosses, faut pas faire erreur!
Marie-Annette se renversa sur son siège, trépigna et poussa une
série de cris inarticulés, croyant devoir simuler une violente crise de
nerfs.
—Oh! non, calme-toi! supplia Cady. Ça ne va pas à ton genre de
beauté. L'attaque d'hystérie, c'est trop nature!...
Jules s'effondra sur le voltaire.
—Quatorze ans! Mais alors, je suis inexcusable!
Cady lui rit au nez.
—Si elle n'a que quatorze ans, moi, j'en ai douze! Frémissez, satyre,
qui nous avez attirées dans un affreux guet-apens!... Mais as pas
peur, vieux, ça n'est pas encore à cause de nous que tu passeras en
correctionnelle!... On ne te cramponnera pas.
Marie-Annette pleurait bruyamment.
—Cady, tu avais bien besoin de te mêler de tout cela!
La fillette se rebiffa.
—Tiens, qui est-ce qui a demandé à ce que je t'accompagne, est-ce
moi?... En voilà des magnes!...
Le jeune homme se leva avec agitation.
—Mesdemoiselles, il est impossible que vous restiez ici plus
longtemps!
Cady éclata de rire.
—Des scrupules!...
Il prit la main de Marie-Annette.
—Je vous en prie, ne m'en veuillez pas... J'avais fait un rêve trop
beau!
Elle tomba sur sa poitrine.
—Alors, c'est donc fini? s'écria-t-elle avec désespoir.
Il hésita, les bras ballants, n'osant ni la repousser ni l'étreindre.
—Oui... non... c'est-à-dire... Vous me mettez dans un cruel
embarras... Ma délicatesse... votre âge... Songez donc!...
—Et ti, ti, ti! et ta, ta, ta! et poum, poum! comme je m'instruis,
comme je m'amuse! chanta Cady en trépignant d'aise.
Marie-Annette se rejeta en arrière.
—Mon âge? s'écria-t-elle aigrement. Et puis après?... En vérité, je
commence à croire que ma cousine avait raison, vous n'êtes qu'un
intrigant!
—Mademoiselle!
Cady intervint.
—Pas de colère ni de gros mots!... J'ai jamais dit que Jules n'était
pas un brave type!... C'est vrai, je vous crois un bon garçon, pas très
fort, mais sans malice... Séparons-nous sans nous fâcher... Marie-
Annette, crois-en ma vieille expérience, faut jamais se fâcher avec
les hommes, ça fait des embêtements... Ecoutez, Julot, on a admiré
vos salons, on a boulotté vos gâteaux, maintenant on va se quitter.
Le jeune homme, mû par une impulsion inattendue, s'empara de la
main de Cady:
—Si l'on se quitte bons amis, l'on peut s'embrasser?
Il se penchait, avançant les lèvres. Cady fit un grand saut en arrière,
poussant sa cousine à sa place.
—Embrassez...
Les lèvres des deux jeunes gens se rencontrèrent maladroitement.
Cady appela:
—Vite, vite! on embarque!
—Adieu!... murmura Marie-Annette d'une voix étouffée.
Et elle sortit précipitamment, suivie de Cady, qui arrêta l'avocat du
geste:
—Vous dérangez pas!... On connaît la piste.
Dans le fiacre où elles ne tardèrent pas à se jeter, Marie-Annette
fondit en larmes, s'écriant mélodramatiquement:
—Oh! Cady, tu viens de briser mon avenir!
—Tu parles, chérie!
XXIV
Comme elle le faisait toujours, depuis qu'elle était en possession de
son piano, Cady, avant de se mettre à l'étude, fit une ronde
soigneuse dans l'appartement, pour vérifier si toutes les portes
étaient bien closes, afin que nul bruit n'arrivât aux oreilles de Mme
Darquet.
Devant la chambre de Baby, un ricanement l'arrêta net.
Il y a des rires sinistres; non point des élans de saine gaîté, mais des
gloussements troublants, lugubres, s'échappant de gorges
contractées; des hilarités de cerveaux détraqués, ivres ou fous...
C'était un de ces rires de folle ou d'ivrognesse que Cady avait
entendu.
Saisie d'un pressentiment et d'une crainte, elle ouvrit brusquement
la porte et demeura un instant immobile sur le seuil, pétrifiée par le
spectacle, qu'elle comprit mal tout d'abord.
Etendue à plat sur le sol, les épaules touchant terre, l'Anglaise, les
genoux relevés, ses jupes retombées découvrant des jambes
maigres aux gros os, avait les yeux stupidement fixés au plafond et
riait d'une voix enrouée cruelle et démente...
Auprès d'elle, Jeanne, nue, enfoncée dans l'eau d'une petite
baignoire, renversait sa tête livide, tordait son buste et ses bras,
solidement maintenue par des cordes.
Les yeux hagards, elle ne pleurait pas, ne criait pas; elle se débattait
seulement, le corps singulièrement blême, avec des plaques
bleuâtres et violacées.
—Baby attachée!... Pourquoi es-tu attachée? balbutia Cady en
s'élançant vers sa sœur.
Puis elle eut un cri de terreur, ses doigts ayant effleuré le corps froid
de l'enfant, l'eau glacée de la baignoire.
Tout se brouillait dans son cerveau.
Pourquoi Jeanne était-elle attachée dans une baignoire d'eau
glacée?... Pourquoi Miss gisait-elle à terre, les vêtements en
désordre, avec un ricanement cruel et fou, et des yeux qui
semblaient ne point voir?
L'Anglaise cessa de rire et se tourna sur le côté, avec un répugnant
hoquet.
Alors, subitement, Cady comprit.
Une punition, une torture inventée par l'Anglaise ivre!...
Rapidement, à coups de ciseaux, elle coupait la corde; elle saisissait
le petit corps grêle, ruisselant, trop lourd pour ses bras, que
l'émotion affaiblissait. Elle dut le déposer sur le tapis.
—Maria!... mademoiselle Armande! Au secours! appela-t-elle avec
détresse.
Ce fut Valentin qui parut d'abord, attiré par l'accent d'angoisse de
Cady.
—Bon Dieu! est-ce qu'il y a le feu?
Maria et Clémence survinrent. Il y eut un instant de désordre,
d'incompréhension. Cady expliquait mal, bouleversée.
Baby avait entièrement perdu connaissance et son corps verdâtre,
violacé, devenait affreux.
—Elle est morte! elle est morte! Miss l'a assassinée! gémit Cady,
livide, tragique.
Comme elle s'élançait affolée au dehors, Valentin la saisit à bras-le-
corps, pâle, lui aussi.
—Voulez-vous bien vous taire!
Mlle Armande accourait au bruit, effarée.
—Mon Dieu, qu'y a-t-il?... Quel tapage! Madame va entendre!...
Clémence saisit l'enfant évanouie qu'elle porta sur son lit.
—Vite! il faut la frictionner!... Des serviettes!... Maria, courez faire
chauffer des serviettes à la cuisine!...
La femme de chambre dut enjamber le corps de la gouvernante,
toujours vautrée à terre, ricanant, bavant, hoquetant, battant le sol
du pied pour une gigue imaginaire.
—Ah! l'horreur de femme! fit-elle répugnée.
Cady, penchée sur le corps inerte de sa sœur répétait:
—Elle est morte, je vous dis! Elle est morte!... Il faut avertir maman!
—Faites pas ça, toujours, crièrent ensemble les domestiques effrayés
et menaçants.
Son chausson de laine à la main, Clémence frottait vigoureusement
le torse et les membres de l'enfant, dont l'épiderme rougissait.
—Elle revient! cria-t-elle. La voilà qui bouge!
En effet, les mâchoires contractées de la petite Jeanne se
desserraient. Ses bras se relevèrent, puis retombèrent. Soudain, ses
dents claquèrent bruyamment, et ses paupières soulevées
montrèrent des yeux qui chavirèrent, ne laissant plus voir que le
blanc.
—Oh, Dieu! elle passe! murmura Mlle Armande en se laissant tomber
sur un siège, près de se trouver mal.
—Mais non, mais non! Ça va mieux, au contraire, affirma Clémence.
Et elle recommença les frictions avec les torchons brûlants que Maria
lui apportait.
—Oh! ce qu'elle claque! fit la femme de chambre impressionnée. Ça
fait mal dans les os de l'entendre!
Cady n'y tint plus.
—Je vais chercher maman! cria-t-elle en s'élançant vers la porte avec
tant de rapidité et si inopinément que nul ne put la retenir.
Il y eut un cri de consternation.
—Nom de Dieu! hurla Valentin. On va tous nous foutre à la porte!...
Ah!... chameau d'Anglaise, va! Te ramasseras-tu, rosse? Attends un
peu voir!
Et, à coups de pied, à coups de poing, il releva la femme qui ricanait
toujours, inconsciente, sa tignasse blonde couvrant son visage, et il
la recoiffa de deux tapes.
Maria se précipita.
—Tiens, là, de l'ammoniaque, sur la cheminée! Fais-lui respirer, ça la
remet sur ses pieds de suite! Elle en a toujours une provision pour
ses cuites!
Et, avisant la baignoire, les cordes coupées demeurées au milieu de
la pièce:
—Ah! Julienne qui va voir tout ça!...
Elle emporta les liens; et, les forces décuplées par la peur d'être
surprise, elle enleva la petite baignoire, l'emporta dans la cuisine
pour la vider.
—Mademoiselle Armande, aidez-nous, rangez la chambre! jetait
Valentin qui, se pinçant le nez d'une main, fourrait impitoyablement
le flacon d'ammoniaque débouché sous les narines de l'Anglaise.
—Surtout, recommanda hâtivement Clémence, on ne sait rien, nous
autres, on n'a rien entendu! Filons!...
Et, enlevant les serviettes, rabattant d'un coup de pied un coin de
tapis relevé, elle abandonna la fillette dans son lit, fuyant dans la
cuisine, dont elle ferma la porte.
Après une dernière bourrade à l'Anglaise, avachie dans un fauteuil,
mais dont les yeux commençaient à recouvrer un regard lucide,
Valentin s'esquiva également.
—Barrez-vous, mademoiselle, conseilla-t-il à l'institutrice. Ça va
chauffer.
Demeurée seule, Mlle Armande hésita: Affronterait-elle Mme
Darquet?... Au bout du compte, elle n'avait personnellement rien à
se reprocher!... Cependant, entendant des portes s'ouvrir et des pas
précipités approcher, elle perdit courage et s'éclipsa comme les
autres.
—Ma foi, qu'elles se débrouillent! murmura-t-elle, le cœur chaviré
d'appréhension.
Dans le salon, la brusque apparition de Cady, pâle et bouleversée,
vêtue d'une robe défraîchie, chaussée de pantoufles en feutre
trouées à l'extrémité, les cheveux noués par un vieux ruban noir,
avait fait tressaillir désagréablement Mme Darquet, ainsi que les deux
dames qui prenaient le thé en causant doucement dans la pièce
tiède, close et assoupie.
Noémi Darquet se redressa, stupéfaite, fronçant les sourcils avec
contrariété.
—Qu'est-ce que c'est?
L'intrusion de sa fille aînée chez elle, en cet équipage, à cette heure,
quand il y avait des visites, était un fait sans précédent.
Très bas, suffoquée par l'effroi de la scène qui se passait là-bas, et
par l'émotion d'avoir à troubler cette froide paix maternelle—tâche
qui, subitement, lui parut au-dessus de ses forces—la fillette
murmura:
—C'est Baby, maman... Baby est très malade!
—Qu'est-ce que tu racontes? s'écria Mme Darquet, avec incrédulité et
impatience. Pourquoi viens-tu ici sans qu'on t'appelle?... Comment
Mlle Lavernière te laisse-t-elle courir ainsi fagotée?...
—Baby est évanouie... J'ai peur qu'elle soit morte, balbutia Cady qui
sentait des vertiges la gagner.

You might also like