Microsoft KB Archive/246686

= Inside SQL Server 7.0 Comments and Corrections =

Article ID: 246686

Article Last Modified on 3/1/2007

-

APPLIES TO


 * MSPRESS Inside Microsoft SQL Server 7.0 ISBN 0-7356-0517-3

-



This article was previously published under Q246686



SUMMARY
This article contains comments, corrections, and information about known errors relating to the Microsoft Press book Inside Microsoft SQL Server 7.0, ISBN 0-7356-0517-3.

The following topics are covered:


 * Page xxiv: Book Does Not Cover Replication
 * Pages xxvii & xxviii: Names Misspelled In Preface
 * Page xxvii: Typographical Error
 * Page 29: Incorrect Spelling Out Of Acronym
 * Page 32: Figure 2-1 Corrections
 * Page 38-39: List Of Data Integrity Types Is Incorrect
 * Page 56: SQL-DMO Clarification
 * Page 57: Remove Database.Dump From Table 2-1
 * Page 111: LSN Correction In Figure 3-6
 * Page 160: Remove Sentence In Third Paragraph
 * Page 165: Table 4-4 Correction To Thai Character Set
 * Page 180: Maximum Size Of Database Is Wrong
 * Page 185: Typo In Note
 * Pages 195 & 196: Error In Filename Extensions In Example
 * Page 197: Corrections To Bullet
 * Pages 199-200: Change Spt_ To Sys
 * Pages 201 & 202: Corrections TO GAM Bit Settings
 * Page 205: Dbo Use Only Option Correction
 * Page 209: Note Correction
 * Page 215: Text Addition
 * Page 221: Table 6-1 Clarification
 * Page 222: Change Bits To Bytes
 * Page 228: Typo In Warning
 * Page 231: Maximum Size Of A Single Data Row Correction
 * Page 231: Text Corrections
 * Page 238: Table 6-4 Correction
 * Page 249: Paragraph Rewritten
 * Page 255: DBCC Command Misspelled
 * Page 258: Delete Text
 * Page 273: Text Correction
 * Page 278: Typo In Code
 * Page 279: Multiple Corrections
 * Page 293: Example Missing Parenthesis
 * Page 293: Sentence Rewritten
 * Page 294: Reword Paragraph For Clarity
 * Page 295: Text Of Bullet Reworded
 * Page 306: Less Than And Greater Than Symbols Reversed
 * Page 333: Add Single Quote To SELECT Statement
 * Page 453: Code Corrections In SELECT Statements
 * Page 461: Table 9-2 Symbol Correction
 * Page 464: Change 10th Bit To 11th Bit
 * Page 474: Remove Extra Parenthesis In Figure 9-7
 * Page 500: Function Name Misspelled
 * Page 524: Code Correction
 * Page 527: Transaction Isolation Level Incorrectly Set
 * Page 538: Code Comment Correction
 * Page 552: Text Correction
 * Page 557: Change Table To Procedure
 * Page 579: Change Sp_configuration To Sp_configure
 * Page 585: Text Correction
 * Page 590: Missing Parentheses In Code
 * Page 591: Change READTEXT To READINDEX
 * Page 592: Byte Corrections
 * Page 594: Change Bytes To Characters
 * Page 595: Example 2 Code Correction
 * Page 656: Corrections To Results From Sp_describe_cursor
 * Page 659: Sp_describe_cursor_columns Returns ID Of Table
 * Page 667: Code Correction In UPDATE Statement
 * Page 670: Several Code Corrections
 * Page 672: ASCII Value For A Is 65
 * Page 673: Change 1000 To 100
 * Page 687: Sentence Correction
 * Page 700: SELECT List Correction
 * Page 704: Missing Commas in Code
 * Page 711: Missing Comma In Select Statement
 * Page 733: Text Corrections
 * Page 751: Calling Sp_getbindtoken Must Include The Word OUTPUT
 * Page 809: LIKE '%Jon' Is Not Sargable
 * Page 812: Sentence Correction
 * Page 825 & 827: Code Corrections



Page xxiv: Book Does Not Cover Replication
On page xxiv, delete second to last paragraph.

"SQL Server database replication is also described in depth--especially the features that are new in version 7.0."

Pages xxvii & xxviii: Names Misspelled In Preface
On page xxviii, in the first paragraph, in the second to last sentence the last name is misspelled.

Change:

"Steve Robertson"

To:

"Steve Robinson"

In the second to last paragraph, in the second sentence the last name is misspelled.

Change:

"Glenn Christensen"

To:

"Glenn Christiansen"

Page xxvii: Typographical Error
On page xxvii, in the second to last paragraph, in the first sentence, "happening" is misspelled.

Change:

"...to figure out experientially what was really happing."

To:

"...to figure out experientially what was really happening."

Page 29: Incorrect Spelling Out Of Acronym
On page 29, in the last paragraph, in the second to last sentence delete "Service Advertising Protocol".

Change:

"...including Microsoft's internal Service Advertising Protocol (SAP) implementation..."

To:

"...including Microsoft's SAP implementation..."

In this instance, SAP is the name of a company (Systemanalyse und Programmentwicklung or Systems, Applications, and Products in Data Processing) and not an acronym for Service Advertising Protocol.

Page 32: Figure 2-1 Corrections
Client Components:

"SQL-DMO" is based on ODBC and belongs in the Open Interfaces box next to "RDO OLE DB for ODBC."

Other BackOffice Servers:

Remove "Microsoft Commercial Internet System" and add "Microsoft Site Server" and "Microsoft SNA Server."

Page 38-39: List Of Data Integrity Types Is Incorrect
Domain integrity is covered on page 40. The first data integrity type covered is entity integrity.

In the last sentence on page 38 change:

"First is domain integrity."

To:

"First is entity integrity."

On page 39, first paragraph, last sentence, change:

"Domain integrity is enforced for a table by making sure that it has a primary key."

To:

"Entity integrity is enforced for a table by making sure that it has a primary key."

Page 56: SQL-DMO Clarification
On page 56, in the second paragraph, insert the following author comment.

"SQL-DMO is more than a set of Automation interfaces, as the paragraph suggests. It is a dual interface COM component, providing both Custom and Automation interfaces."

Page 57: Remove Database.Dump From Table 2-1
On page 57, in Table 2-1, Remove the "Database.Dump" Object.Method and the corresponding Action.

The DMO Dump Method is not supported in SQL Server 7.0.

Page 111: LSN Correction In Figure 3-6
On page 111, in Figure 3-6, in the second Transaction Log:

Change the LSN value from:

"LSN: 2:290:4"

To:

"LSN: 2:290:6"

Page 160: Remove Sentence In Third Paragraph
On page 160, in the third paragraph, remove second sentence.

"Windows NT Authentication for SQL Server uses the Windows NT impersonation features, which are available only with these default networking choices."

As of SQL Server 7.0, Windows NT Authentication (formerly called Integrated Security) is available over all network protocols.

Page 165: Table 4-4 Correction To Thai Character Set
On page 165, in Table 4-4, in the Character Set column:

Change:

"Thai (DBCS)"

To:

"Thai"

Page 180: Maximum Size Of Database Is Wrong
On page 180, in the first bullet point:

Change:

"Can range in size from 1 MB through a theoretical limit of 1 TB (1,048,576 MB) in size."

To:

"Can range in size from 1 MB through a theoretical limit of 1,048,516 TB in size."

Page 185: Typo In Note
On page 185, in the second sentence, in the note, "test" should be "testdb".

Change:

"The Enterprise Manager will give the data file the logical name of testdb_Data (instead of just test)..."

To:

"The Enterprise Manager will give the data file the logical name of testdb_Data (instead of just testdb)..."

Pages 195 & 196: Error In Filename Extensions In Example
On pages 195 & 196, in the FILEGROUP CREATION Example, all of the data file names in the example use .mdf as their filename extension. Only the first one should use .mdf. The rest, except for the last one (..\saleslog.ldf) should use .ndf.

Page 197: Corrections To Bullet
On page 197, the third white bullet, NAME should be FILENAME.

Change:

"Change the NAME property for files only in the tempdb database; this change doesn't go into effect until you stop and restart SQL Server."

To:

"Change the FILENAME property for files only in the tempdb database; this change doesn’t go into effect until you stop and restart SQL Server.

Changing the FILENAME can be used to move the files to a new physical location. (Note that there is no supported way to change the logical name of any file.)"

Pages 199-200: Change Spt_ To Sys
On page 199, in the last sentence, "spt_" should be "sys".

Change:

"All these system objects, in both the master and user databases, have names that begin with spt_."

To:

"All these system objects, in both the master and user databases, have names that begin with sys."

Pages 201 & 202: Corrections TO GAM Bit Settings
On page 201, the third bullet, in the last sentence:

Change:

"If the bit is 1, the corresponding extent is in use; if the bit is 0, the extent is free."

To:

"If the bit is 0, the corresponding extent is in use; if the bit is 1, the extent is free."

Page 202, change the table at the top of the page to:

Page 205: Dbo Use Only Option Correction
On page 205, in the "dbo use only" database option description, the first sentence needs the following modifications.

Change:

"When TRUE, this option prevents all users except the database owner from subsequently using the database."

To:

"When TRUE, this option prevents all users except the database owner and members of the db_owner role from subsequently using the database."

Page 209: Note Correction
On page 209, in the Note, revise the first sentence as follows.

Change:

"The only options that you can set for the master database are autoclose, torn page detection, and trunc. log on chkpt."

To:

"The only option you can set for the master database is the trunc. log on chkpt. option."

Page 215: Text Addition
On page 215, in the second sentence, add db_ddladmin.

Change:

"...but anyone with the sysadmin or db_owner role can create a table owned by another use."

To:

"...but anyone with the sysadmin, db_ddladmin, or db_owner role can create a table owned by another use."

Page 221: Table 6-1 Clarification
Binary and varbinary datatypes can both store up to 8000 bytes.

Page 222: Change Bits To Bytes
On page 222, in the second paragraph, in the first sentence change bits to bytes.

Change:

"...because the last six bits..."

To:

"...because the last six bytes..."

Page 228: Typo In Warning
On page 228, under "Warning", in the last sentence:

Change:

"We can't overemphasize that you're best bet for avoiding confusion..."

To:

"We can't overemphasize that your best bet for avoiding confusion..."

Page 231: Maximum Size Of A Single Data Row Correction
On page 231, in the third paragraph, in the second sentence change maximum size of a single data row to 8060.

Change:

"The maximum size of a single data row is 8096 bytes."

To:

"The maximum size of a single data row is 8060 bytes."

Although SQL Server 7.0 does leave 8096 bytes on a data page for data and row offsets, the maximum size of a single row is only 8060 bytes. The choice of an upper limit was somewhat arbitrary. There are some things designed into the row format, not yet exposed, which will cause the overhead of a row to grow in future releases if the developers end up using them. They would like to have your existing rows still fit even if extra space is needed for overhead in the future. So, they chose 8060 bytes as a reasonable upper limit.

Page 231: Text Corrections
On page 231, revise the first sentence as follows.

Change:

"Data pages are the structures that contain all of a table's nontext and image data."

To:

"Data pages are the structures that contain all of a table's data that is not text or not an image."

Also, on page 231, in the third paragraph, revise the third sentence as follows.

Change:

"...(except for nontext and image columns, which are stored in their own separate pages)."

To:

"...(except for text or image columns, which are stored in their own separate pages)."

Page 238: Table 6-4 Correction
On page 238, Table 6-4, Information column, in the text following NULL bitmap entry, change "byte" to "bit".

Change:

"(1 byte for each column in table; a 1 indicates that the corresponding column is NULL)"

To:

"(1 bit for each column in table; a 1 indicates that the corresponding column is NULL)"

Page 249: Paragraph Rewritten
Page 249, replace the last full paragraph with the following text.

"The DROP_EXISTING option specifies that a given index should be dropped and rebuilt as a single transaction, and is particularly useful in the case of rebuilding clustered indexes. Because nonclustered indexes must go through the clustered index to gain access to rows in a table, the DROP_EXISTING option prevents the nonclustered indexes from having to be rebuilt twice. Normally, when a clustered index is dropped, every nonclustered index has to be rebuilt to change its bookmarks to RIDs, instead of the clustering keys. Then, if a clustered index is built (or rebuilt), all the nonclustered indexes need to be rebuilt again to update the bookmarks. The DROP_EXISTING option to the CREATE INDEX command allows a clustered index to be rebuilt without having to rebuild the nonclustered indexes twice. If you are creating the index on the exact same keys it had previously, the nonclustered indexes do not need to be rebuilt at all. If you are changing the key definition, the nonclustered indexes are only rebuilt once, after the clustered index is rebuilt."

Page 255: DBCC Command Misspelled
On page 255, in the second paragraph, the second sentence contains a misspelled command.

Change:

"If this happens, you can use the DBCC CHECKINDENT command..."

To:

"If this happens, you can use the DBCC CHECKIDENT command..."

Page 258: Delete Text
On page 258, in the first paragraph, delete the second to last sentence.

"A table-level constraint must always be named by its creator."

Also on page 258, in the first paragraph, in the last sentence delete "column-level".

Change:

"...it's probably wise to explicitly name column-level constraints so that the same name will be used on all servers."

To:

"...it's probably wise to explicitly name constraints so that the same name will be used on all servers."

Page 273: Text Correction
On page 273, under the CASCADE bullet:

Change:

"A delete of all matching rows in the referenced table occurs."

To:

"A delete of all matching rows in the referencing table occurs."

Page 278: Typo In Code
Change: ALTER TABLE employee add department_no int CHECK (department_no < 100 AND department_no > 100) To: ALTER TABLE employee add department_no int CHECK (department_no < 0 AND department_no > 100)

Page 279: Correct number of days
On page 279, in the second paragraph, in the second sentence:

Change:

"...to ensure that updates can't be made after day 28 of the month..."

To:

"...to ensure that updates can't be made after day 27 of the month..."

Page 293: Example Missing Parenthesis
On page 293, the last line of the Example is missing a parenthesis.

Change: ALTER COLUMN emp_name (varchar(50) To: ALTER COLUMN emp_name (varchar(50))

Page 293: Sentence Rewritten
On page 293, revise the fifth bullet as follows.

Change:

"If the modified column participates in an index, the only type changes that are allowed are increasing the length of a variable length type, changing nullability of the column (for example, VARCHAR(10) to VARCHAR(20)), or both."

To:

"If the modified column participates in an index, the only type changes that are allowed are increasing the length of a variable length type (for example, VARCHAR(10) to VARCHAR(20)), changing nullability of the column, or both."

Page 294: Reword Paragraph For Clarity
On page 294, change the second to last paragraph to:

"You need to be aware when using ALTER TABLE to drop constraints that dropping a PRIMARY KEY or UNIQUE constraint will automatically drop the associated index. In fact, the only way to drop those indexes is by altering the table to remove the constraint."

Page 295: Text Of Bullet Reworded
On page 295, reword the fifth bullet.

Change:

"A column bound to a rule, accomplished via the following syntax:"

To:

"A column to which a rule is bound. Dropping a column is accomplished by using the following syntax:"

Page 306: Less Than And Greater Than Symbols Reversed
On page 306, in the fourth paragraph, in the second sentence:

Change:

"...an inner join can use an operator such as less than (>) or greater than (<)..."

To:

"...an inner join can use an operator such as less than (<) or greater than (>)..."

Page 333: Add Single Quote To SELECT Statement
On page 333, in the last query, add a single quote to the second line.

Change: 'Author'=CONVERT(varchar(20), RTRIM(au_lname) + ,' To: 'Author'=CONVERT(varchar(20), RTRIM(au_lname) + ','

Page 453: Code Corrections In SELECT Statements
On page 453, in the first SELECT statement, in the fourth and fifth lines of code:

Change: 'Type' = WHEN type = 'mod_cook' THEN 'Modern Cooking', To: 'Type' = CASE WHEN type = 'mod_cook' THEN 'Modern Cooking'

Also on page 453, in the second SELECT statement, in the fourth and fifth lines of code:

Change: 'Type' = type WHEN 'mod_cook' THEN 'Modern Cooking', To: 'Type' = CASE type WHEN 'mod_cook' THEN 'Modern Cooking'

Page 461: Table 9-2 Symbol Correction
On page 461, in Table 9-2, in the Symbol Column:

Change:

"?"

To:

"-"

Page 464: Change 10th Bit To 11th Bit
On page 464, in the second paragraph, in the last sentence:

Change:

"...which is the tenth bit or decimal 1024..."

To:

"...which is the eleventh bit or decimal 1024..."

Page 474: Remove Extra Parenthesis In Figure 9-7
On page 474, in Figure 9-7, Style entry corresponding to the ODBC canonical Output Type:

Change:

"hh:mi:ss((24h)"

To:

"hh:mi:ss(24h)"

Page 500: Function Name Misspelled
On page 500, in the first paragraph, in the last sentence:

Change:

"...SUSER_SAME..."

To:

"...SUSER_SNAME..."

Page 524: Code Correction
On page 524, in the fourth line down, change 0 to 1.

Change: IF (@@ROWCOUNT > 0) To: IF (@@ROWCOUNT > 1) There will be one 'Smith' even if the transaction never happened at all, and no dirty data was read.

Page 527: Transaction Isolation Level Incorrectly Set
On page 527, in the 12th line down:

Change: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE To: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Page 538: Code Comment Correction
On page 538, in the third line from the bottom:

Change: -- Illegal parameter value. Must be between 0 and 12. To: -- Illegal parameter value. Must be between 0 and 32.

Page 552: Text Correction
On page 552, in the second to last paragraph, in the second sentence:

Change:

"The text of a stored procedure (including comments) is stored in syscomments552 which is typically useful."

To:

"The text of a stored procedure (including comments) is stored in syscomments which is typically useful."

Page 557: Change Table To Procedure
On page 557, in the second to last paragraph, in the second to last sentence, change "table" to "procedure".

Change:

"Because the scoping of a private temporary table is specific..."

To:

"Because the scoping of a private temporary procedure is specific..."

Page 579: Change Sp_configuration To Sp_configure
On page 527, in the second to last paragraph, in the last sentence:

Change:

"...(but only if sp_configuration 'nested triggers' ist set to 1, as we'll see in a moment)."

To:

"...(but only if sp_configure 'nested triggers' ist set to 1, as we'll see in a moment)."

Also on page 527, in the last paragraph, in the second sentence:

Change:

"...depends on the current sp_configuration value..."

To:

"...depends on the current sp_configure value..."

Page 585: Text Correction
On page 585, in the second full paragraph, in the second to last sentence:

Change:

"...(or varchar(4000) for Unicode data)..."

To:

"...(or nvarchar(4000) for Unicode data)..."

Page 590: Missing Parentheses In Code
On page 590, in the second set of code, add parentheses around the seventh line.

Change: @sizeneeded=DATALENGTH(pr_info) - PATINDEX('%Washington%',pr_info) - 1 To: @sizeneeded=DATALENGTH(pr_info) - (PATINDEX('%Washington%',pr_info) - 1)

Page 591: Change READTEXT To READINDEX
On page 591, in the first paragraph after the Note, in the second sentence:

Change:

"READINDEX treats the first character as offset 0."

To:

"READTEXT treats the first character as offset 0."

Page 592: Byte Corrections
On page 592, in the first paragraph after Note, in the fourth sentence:

Change:

"For example, with the default network packet size of 4192 bytes (4 KB), a good read size would be about 4100 bytes, assuming that your application could deal with that size."

To:

"For example, with the default network packet size of 4096 bytes (4 KB), a good read size would be about 4000 bytes, assuming that your application could deal with that size."

Page 594: Change Bytes To Characters
On page 594, in the first paragraph, in the third to last sentence, change "bytes" to "characters".

Change:

"The delete_length parameter tells you how many bytes to delete.."

To:

"The delete_length parameter tells you how many characters to delete.."

Page 595: Example 2 Code Correction
On page 595, in the eighth line of code:

Change: IF @mytextptr IS NOT NULL AND @pat_offset >= 0 To: IF @mytextptr IS NOT NULL AND @pat_offset > 3

Page 656: Corrections To Results From Sp_describe_cursor
On page 656, in the information returned that immediately follows the code:

Change Status from:

"0"

To:

"1"

Change Cursor_rows from:

"0"

To:

"3"

Change Fetch_status from:

"0"

To:

"-9"

Page 659: Sp_describe_cursor_columns Returns ID Of Table
On page 659, in the last paragraph, in the third sentence:

Change:

"The information it returns includes the name of the column, the datatype, the ordinal position of the column, and the name of the table from which the cursor is selected."

To:

"The information it returns includes the name of the column, the datatype, the ordinal position of the column, and the ID of the table from which the cursor is selected."

Page 667: Code Correction In UPDATE Statement
On page 667, in the first block of code, in the second line change 10 to 7.

Change: SET phone = '425' + substring(phone, 4, 10) To: SET phone = '425' + substring(phone, 4, 7)

Page 670: Several Code Corrections
On page 670, in the second block of code, correct first four lines of code as follows.

Change: CREATE TRIGGER update_budget ON budget FOR update AS

IF (@@rowcount > 0 BEGIN    PRINT 'Only one row can be updated at a time' To: CREATE TRIGGER update_budget ON budget FOR update AS

IF (@@rowcount = 0) RETURN

IF (@@rowcount > 1) BEGIN PRINT 'Only one row can be updated at a time'

Page 672: ASCII Value For A Is 65
On page 672, in the last paragraph, in the first sentence change 64 to 65.

Change:

"...and add that number to 64, which is the ASCII value for A."

To:

"...and add that number to 65, which is the ASCII value for A."

Page 673: Change 1000 To 100
On page 673, in the thirteenth line of code:

Change: /* Insert 1000 rows of data */ To: /* Insert 100 rows of data */

Page 687: Sentence Correction
On page 687, in the second paragraph, correct the seventh sentence as follows.

Change:

"In fact, the data was not inserted in order (although a clustered index exists, so if data were selected without an ORDER BY, it would seem to be in order)."

To:

"In fact, the data was not inserted in order."

Page 700: SELECT List Correction
On page 700, in the third line of code:

Change: M.mgr_no, M.emp_name AS Manager, M.emp_title AS Mgr_title To: M.emp_no, M.emp_name AS Manager, M.emp_title AS Mgr_title

Page 704: Missing Commas in Code
On page 704, in the first five lines of code after comments:

Change: CREATE TABLE #orgchart (seq_no    int IDENTITY org_level       int NOT NULL emp_id      int NOT NULL ) To: CREATE TABLE #orgchart (seq_no    int IDENTITY, org_level   int NOT NULL, emp_id      int NOT NULL )

Page 711: Missing Comma In Select Statement
On page 711, in the first complete block of code, in the sixth line down:

Change: SUM(CASE qtr WHEN 4 THEN value ELSE 0 END) AS q4 To: SUM(CASE qtr WHEN 4 THEN value ELSE 0 END) AS q4,

Page 733: Text Corrections
On page 733, in the first paragraph after Note, in the first sentence:

Change:

"...if they had decided to always access the customer table first and the parts table second."

To:

"...if they had decided to always access the authors table first and the publishers table second."

Page 751: Calling Sp_getbindtoken Must Include The Word OUTPUT
On page 751, in the second line of code:

Change: EXEC sp_getbindtoken @token To: EXEC sp_getbindtoken @token OUTPUT

Page 809: LIKE '%Jon' Is Not Sargable
On page 809, in the middle paragraph, in the second to last sentence:

Change:

"For example, LIKE 'Jon%' is sargable but LIKE 'Jon%' is not because the wildcard (%) at the beginning prevents the use of an index."

To:

"For example, LIKE 'Jon%' is sargable but LIKE '%Jon' is not because the wildcard (%) at the beginning prevents the use of an index."

Page 812: Sentence Correction
On page 812, in the first paragraph, in the third sentence:

Change:

"So if the employee table has a clustered index on the employee ID (emp_id) column, the nonclustered index on lname contains both the last name and the ID for every data row, stored in the leaf level of the index.

To:

So if the employee table has a clustered index on the employee ID (emp_id) column, the nonclustered index described earlier, on lname, fname and hire_date, will also contain the emp_ID for every data row, stored in the leaf level of the index."

Page 825 & 827: Code Corrections
On pages 825 & 827, in the second and third lines of code on each page:

Change: FROM employee.dept_no empl JOIN department.dept_no dept ON dept.deptno=empl.deptno To: FROM employee empl JOIN department dept ON dept.dept_no=empl.dept_no

Microsoft Press is committed to providing informative and accurate books. All comments and corrections listed above are ready for inclusion in future printings of this book. If you have a later printing of this book, it may already contain most or all of the above corrections.

Additional query words: 0-7356-0517-3 SQL DEVBOOK

Keywords: kbdocerr kbdocfix kbinfo KB246686

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.