Errata for Inside Microsoft® SQL Server™ 2005
Submit your own errata for this product.
The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".
The following errata were submitted by our customers and approved as valid errors by the author or editor.
Color Key: Serious Technical Mistake Minor Technical Mistake Language or formatting error Typo Question Note Update
| Version |
Location |
Description |
Submitted By |
Date Submitted |
Date Corrected |
| Printed |
Page Sample Code
|
Updated version of Chapter 8 sample code available
An updated version of the sample file installed to "My DocumentsMicrosoft PressInside T SQL ProgrammingChapter 08 - Triggers.sql" is available for download from the Microsoft Download Center:
Ch8Trigr.exe
http://download.microsoft.com/download/f/6/d/f6df6fa4-18c3-46fa-922d-c8cbc2ea3851/ch8trigr.exe
Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file.
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 11
|
"cover discuss" should be "cover"
On page 11, the last sentence of the first paragraph contians incorrect wording.
Change:
"I’ll cover discuss three techniques that involve overlaps: identifying overlaps, grouping overlaps, and max overlaps."
To:
"I’ll cover three techniques that involve overlaps: identifying overlaps, grouping overlaps, and max overlaps."
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 17
|
Additional code needed in sample
On page 17, the code sample at the bottom of the page is missing a line.
Change:
SELECT app,
(SELECT COUNT(*) FROM dbo.Sessions AS C
WHERE ts >= starttime
AND ts < endtime) AS cnt
FROM (SELECT DISTINCT app, starttime AS ts
FROM dbo.Sessions) AS T;To:
SELECT app,
(SELECT COUNT(*) FROM dbo.Sessions AS C
WHERE C.app = T.app
AND ts >= starttime
AND ts < endtime) AS cnt
FROM (SELECT DISTINCT app, starttime AS ts
FROM dbo.Sessions) AS T;
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 18
|
Code missing from sample
On page 18, the code sample is missing a line.
Change:
SELECT app, MAX(cnt) AS mx
FROM (SELECT app,
(SELECT COUNT(*) FROM dbo.Sessions AS C
WHERE ts >= starttime
AND ts < endtime) AS cnt
FROM (SELECT DISTINCT app, starttime AS ts
FROM dbo.Sessions) AS T) AS D
GROUP BY app;To:
SELECT app, MAX(cnt) AS mx
FROM (SELECT app,
(SELECT COUNT(*) FROM dbo.Sessions AS C
WHERE C.app = T.app
AND ts >= starttime
AND ts < endtime) AS cnt
FROM (SELECT DISTINCT app, starttime AS ts
FROM dbo.Sessions) AS T) AS D
GROUP BY app;
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 32
|
Missing definition of column xml_data in code sample
On page 32, the CREATE TABLE section of the code sample reads:
CREATE TABLE dbo.CustomerData
(
custid INT NOT NULL PRIMARY KEY,
txt_data VARCHAR(MAX) NULL,
ntxt_data NVARCHAR(MAX) NULL,
binary_data VARBINARY(MAX) NULL
);It should read:
CREATE TABLE dbo.CustomerData
(
custid INT NOT NULL PRIMARY KEY,
txt_data VARCHAR(MAX) NULL,
ntxt_data NVARCHAR(MAX) NULL,
binary_data VARBINARY(MAX) NULL,
xml_data XML NULL
);
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 47
|
Incorrect reference to information printed earlier in the chapter
On page 47, the first sentence of the last paragraph in the "Why Do We Need Complex Classes?" section reads:
"Note that as mentioned earlier in the chapter, the XML datatype can be adequate to store the state of objects using XML serialization in a database as well."
It should read:
"Note that the XML datatype can be adequate to store the state of objects using XML serialization in a database as well."
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 55
|
The DivCn method is missing a division by zero check
On page 55, the Division section of the code sample reads:
// Division
public ComplexNumberCS DivCN(ComplexNumberCS c)
{
// null checking
if (this._isnull || c._isnull)
return new ComplexNumberCS(true);
// division
return new ComplexNumberCS(
(this.Real * c.Real + this.Imaginary * c.Imaginary)
/ (c.Real * c.Real + c.Imaginary * c.Imaginary),
(this.Imaginary * c.Real - this.Real * c.Imaginary)
/ (c.Real * c.Real + c.Imaginary * c.Imaginary)
);
}It should read:
// Division
public ComplexNumberCS DivCN(ComplexNumberCS c)
{
// null checking
if (this._isnull || c._isnull)
return new ComplexNumberCS(true);
// zero checking
if (c.Real == 0 && c.Imaginary == 0)
throw new ArgumentException();
// division
return new ComplexNumberCS(
(this.Real * c.Real + this.Imaginary * c.Imaginary)
/ (c.Real * c.Real + c.Imaginary * c.Imaginary),
(this.Imaginary * c.Real - this.Real * c.Imaginary)
/ (c.Real * c.Real + c.Imaginary * c.Imaginary)
);
}
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 56
|
Drive letter missing in path to ComplexNumberCS.dl
On page 56, the second line of the first code sample reads:
FROM ' ComplexNumberCSComplexNumberCSinDebugComplexNumberCS.dll'It should read:
FROM ' C:ComplexNumberCSComplexNumberCSinDebugComplexNumberCS.dll'
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 58
|
Incorrect complex number referenced
On page 58, the first sentence of the first sentence reads:
"You can see that the second complex number (2, 3i) is sorted before the first one (2, 3i)"
It should read:
"You can see that the second complex number (1, 7i) is sorted before the first one (2, 3i)"
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 63-64
|
Missing check for divide by zero error, and error in code comments
On pages 63-64, the #Region "arithmetic operations" section in Listing 1-5 reads:
#Region "arithmetic operations"
' Addition
Public Function AddCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
' addition
Return New ComplexNumberVB(Me.Real + c.Real, _
Me.Imaginary + c.Imaginary)
End Function
' Subtraction
Public Function SubCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
' addition
Return New ComplexNumberVB(Me.Real - c.Real, _
Me.Imaginary - c.Imaginary)
End Function
' Multiplication
Public Function MulCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
' addition
Return New ComplexNumberVB(Me.Real * c.Real - _
Me.Imaginary * c.Imaginary, _
Me.Imaginary * c.Real + Me.Real * c.Imaginary)
End Function
' Division
Public Function DivCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
' addition
Return New ComplexNumberVB(_
(Me.Real * c.Real + Me.Imaginary * c.Imaginary) _
/ (c.Real * c.Real + c.Imaginary * c.Imaginary), _
(Me.Imaginary * c.Real - Me.Real * c.Imaginary) _
/ (c.Real * c.Real + c.Imaginary * c.Imaginary) _
)
End Function
#End RegionIt should read:
#Region "arithmetic operations"
' Addition
Public Function AddCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
' addition
Return New ComplexNumberVB(Me.Real + c.Real, _
Me.Imaginary + c.Imaginary)
End Function
' Subtraction
Public Function SubCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
' subtraction
Return New ComplexNumberVB(Me.Real - c.Real, _
Me.Imaginary - c.Imaginary)
End Function
' Multiplication
Public Function MulCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
' multiplication
Return New ComplexNumberVB(Me.Real * c.Real - _
Me.Imaginary * c.Imaginary, _
Me.Imaginary * c.Real + Me.Real * c.Imaginary)
End Function
' Division
Public Function DivCN(ByVal c As ComplexNumberVB) As ComplexNumberVB
'Null(checking)
If Me.isNullValue Or c.isNullValue Then
Return New ComplexNumberVB(True)
End If
'Zero checking
If c.Real = 0 And c.Imaginary = 0 Then
Throw New ArgumentException()
End If
' division
Return New ComplexNumberVB( _
(Me.Real * c.Real + Me.Imaginary * c.Imaginary) _
/ (c.Real * c.Real + c.Imaginary * c.Imaginary), _
(Me.Imaginary * c.Real - Me.Real * c.Imaginary) _
/ (c.Real * c.Real + c.Imaginary * c.Imaginary) _
)
End Function
#End Region
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 69
|
.vsd file referenced in place of .vdx
On page 69, the last sentence of the paragraph following Figure 1-7 reads:
"To follow the demonstration, create the folder C:VisioFiles and copy the .vsd files from the book’s CD to that folder."
It should read:
"To follow the demonstration, create the folder C:VisioFiles and copy the .vdx files from the book’s CD to that folder."
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 71
|
".value" used in place of "value"
On page 71, the first sentence of the last paragraph reads:
"I used the .value method of the XML data type."
It should read:
"I used the value method of the XML data type."
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 74
|
The phrase "up to three" used in place of "three other types of"
On page 74, the second sentence of the first paragraph reads:
"After creating the Primary XML index, you can create up to three secondary XML Indexes:"
It should read:
"After creating the Primary XML index, you can create three other types of secondary XML Indexes:"
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 77
|
Term Hobbie used in place of Hobby
On page 77, the third line of the last code sample reads:
BeerIt should read:
Beer
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 78
|
Term Hobbie used in place of Hobby
On page 78, the third line of the list of errors reads:
English where element 'Foreign:Hobbie' was specified. Location: /*:Foreigns[1]/*:Hobbie[1]It should read:
English where element 'Foreign:Hobby' was specified. Location: /*:Foreigns[1]/*:Hobby[1]
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 82
|
Term Hobbie used in place of Hobby
On page 82, the fifth line of the last code sample reads:
insert CigarIt should read:
insert Cigar
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 92
|
Table #T2 referenced in place of table #T1
On page 92, the first line on the page reads:
"though proc2’s code creates a table called #T2 with two columns and loads a row with two"
It should read:
"though proc2’s code creates a table called #T1 with two columns and loads a row with two"
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 93 and 94
|
Table #T42 referenced in place of table #T
On pages 93 and 94, the sample code reads:
-- Assume @schema and @insert were constructed dynamically
DECLARE @schema AS VARCHAR(1000), @insert AS VARCHAR(1000);
SET @schema = 'col1 INT, col2 DECIMAL(10, 2)';
SET @insert = 'INSERT INTO #T42 VALUES(10, 20.30)';
-- In the outer level, create temp table #T with a single dummy column
CREATE TABLE #T42(dummycol INT);
-- Within a dynamic batch:
-- Alter #T adding the columns you need
-- Alter #T dropping the dummy column
-- Open another level of dynamic execution
-- Populate #T
EXEC('
ALTER TABLE #T42 ADD ' + @schema + ';
ALTER TABLE #T42 DROP COLUMN dummycol;
EXEC(''' + @insert + ''')');
GO
-- Back in the outer level, access #T in a new batch
SELECT * FROM #T42;
-- Cleanup
DROP TABLE #T42;It should read:
-- Assume @schema and @insert were constructed dynamically
DECLARE @schema AS VARCHAR(1000), @insert AS VARCHAR(1000);
SET @schema = 'col1 INT, col2 DECIMAL(10, 2)';
SET @insert = 'INSERT INTO #T VALUES(10, 20.30)';
-- In the outer level, create temp table #T with a single dummy column
CREATE TABLE #T(dummycol INT);
-- Within a dynamic batch:
-- Alter #T adding the columns you need
-- Alter #T dropping the dummy column
-- Open another level of dynamic execution
-- Populate #T
EXEC('
ALTER TABLE #T ADD ' + @schema + ';
ALTER TABLE #T DROP COLUMN dummycol;
EXEC(''' + @insert + ''')');
GO
-- Back in the outer level, access #T in a new batch
SELECT * FROM #T;
-- Cleanup
DROP TABLE #T;
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 98
|
100000 used instead of 10000 in code sample
On page 98, the tenth line of the code sample reads:
SELECT n, (n - 1) % 100000 + 1 FROM dbo.NumsIt should read:
SELECT n, (n - 1) % 10000 + 1 FROM dbo.Nums
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 100
|
100000 used instead of 10000 in code sample
On page 100, the first line of the code sample reads:
SELECT n AS col1, (n - 1) % 100000 + 1 AS col2,It should read:
SELECT n AS col1, (n - 1) % 10000 + 1 AS col2,
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 119
|
Correction in caption for listing 3-3
On page 119, the caption under listing 3-3 reads:
"Cursor code for custom aggregate"
It should read:
"Cursor code for running aggregations"
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 121
|
Correction in inline caption for Figure 3-1
On page 121, the inline caption for Figure 3-1 reads:
"Max Concurrent Sessions Benchmark"
It should read:
"Running Aggregations Benchmark"
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 148
|
sp_droplinkedsrvlogin used in place of sp_addlinkedsrvlogin
On page 148, the third bullet point reads:
"Use the sp_droplinkedsrvlogin stored procedure to map local logins to a security account on the remote server."
It should read:
"Use the sp_addlinkedsrvlogin stored procedure to map local logins to a security account on the remote server."
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 160
|
The term Inserts used in place of Updates
On page 160, the title of Table 4-6 reads:
"Table 4-6 Contents of Computations Table After Inserts"
It should read:
"Table 4-6 Contents of Computations Table After Updates"
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 168
|
Underscore character treated as a wildcard character
On page 168, the seventh and eighth lines of the IF block in listing 4-7 read:
OR UPPER(@cols) LIKE UPPER(N'%xp_%')
OR UPPER(@cols) LIKE UPPER(N'%sp_%')They should read:
OR UPPER(@cols) LIKE UPPER(N'%xp[_]%')
OR UPPER(@cols) LIKE UPPER(N'%sp[_]%')
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 169
|
Underscore character treated as a wildcard character
On page 169, the seventh and eighth lines of the IF block in listing 4-8 read:
OR UPPER(@cols) LIKE UPPER(N'%xp_%')
OR UPPER(@cols) LIKE UPPER(N'%sp_%')They should read:
OR UPPER(@cols) LIKE UPPER(N'%xp[_]%')
OR UPPER(@cols) LIKE UPPER(N'%sp[_]%')
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 195
|
Missing terms from the code sample
On page 195, the ninth line of the first code sample reads:
JOIN dbo.VSalesRN AS PrvIt should read:
LEFT OUTER JOIN dbo.VSalesRN AS Prv
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 197
|
JOIN used in place of LEFT OUTER JOIN
On page 197, the 13th line of the code sample reads:
JOIN CSalesRN AS Prv
It should read:
LEFT OUTER JOIN CSalesRN AS Prv
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 202
|
sys.sql.modules referenced in place of sys.sql_modules
On page 202, the second sentence of the last paragraph on the page reads:
"If you don’t specify the ENCRYPTION option, SQL Server stores the text defining the body of the object/routine as clear text in sys.sql.modules (or in syscomments in SQL Server 2000)."
It should read:
"If you don’t specify the ENCRYPTION option, SQL Server stores the text defining the body of the object/routine as clear text in sys.sql_modules (or in syscomments in SQL Server 2000)."
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 288
|
"schema" should be "owner"
On page 288, the first bullet point on the page incorrectly uses the word "schema".
Change:
"The stored procedure and the underlying objects belong to the same schema."
To:
"The stored procedure and the underlying objects belong to the same owner."
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 303
|
Underscore character treated as a wildcard character
On page 303, the second and third lines read:
OR UPPER(@cols) LIKE UPPER(N'%xp_%')
OR UPPER(@cols) LIKE UPPER(N'%sp_%')They should read:
OR UPPER(@cols) LIKE UPPER(N'%xp[_]%')
OR UPPER(@cols) LIKE UPPER(N'%sp[_]%')
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 332
|
Incorrect code sample
On page 332, the SELECT statement in the code sample reads:
SELECT COLUMN_NAME AS updated_column
FROM INFORMATION_SCHEMA.COLUMNS AS C JOIN @UpdCols AS U
ON C.ORDINAL_POSITION = U.ordinal_position
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'T1'
ORDER BY C.ORDINAL_POSITION;It should read:
SELECT COLUMN_NAME AS updated_column
FROM INFORMATION_SCHEMA.COLUMNS AS C JOIN @UpdCols AS U
ON COLUMNPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
+ '.' + QUOTENAME(TABLE_NAME)),
COLUMN_NAME, 'ColumnID') = U.ordinal_position
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'T1'
ORDER BY U.ORDINAL_POSITION;
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 335
|
T1A used in place of T1
On page 335, the frist sentence at the top of the page reads:
"Query the tables T1Audit and T1A, and you will get the results shown in Tables 8-3 and 8-4, respectively:"It should read:"Query the tables T1Audit and T1, and you will get the results shown in Tables 8-3 and 8-4, respectively:
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 335
|
The captions for tables 8-3 and 8-4 are reversed
On page 335, the caption for table 8-3 reads:
"Table 8-3 Contents of T1Audit"
It should read:
"Table 8-3 Contents of T1"
The caption for table 8-4 reads:
"Table 8-4 Contents of T1"
It should read:
"Table 8-4 Contents of T1Audit"
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 345
|
.query method suggested in place of .value
On page 345, the first two sentences of the paragraph following the More Info box read:
"To extract a particular attribute from the XML value, you use the following XQuery expression: xml_value.query('data(//attribute_name)'). xml_value will typically be a variable to which you assigned the XML value returned by the eventdata function, and attribute_name is the name of the attribute you want to extract."
They should read:
"To extract a particular attribute from the XML value, you use the following XQuery expression: xml_value.value('()[1]', ). xml_value will typically be a variable to which you assigned the XML value returned by the eventdata function, and is the path to the attribute you want to extract."
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 346
|
.query used in place of .value in Listing 8-10
On pages 346, lines 9-11 of Listing 8-10 read:
+ QUOTENAME(CAST(@eventdata.query('data(//SchemaName)') AS sysname))
+ N'.' +
QUOTENAME(CAST(@eventdata.query('data(//ObjectName)') AS sysname));
They should read:
+ QUOTENAME(@eventdata.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'))
+ N'.' +
QUOTENAME(@eventdata.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'));
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 348
|
.query used in place of .value in Listing 8-11
On page 348, lines 8-13 of the code in listing 8-11 read:
CAST(@eventdata.query('data(//PostTime)') AS VARCHAR(23)),
CAST(@eventdata.query('data(//EventType)') AS sysname),
CAST(@eventdata.query('data(//LoginName)') AS sysname),
CAST(@eventdata.query('data(//SchemaName)') AS sysname),
CAST(@eventdata.query('data(//ObjectName)') AS sysname),
CAST(@eventdata.query('data(//TargetObjectName)') AS sysname),They should read:
@eventdata.value('(/EVENT_INSTANCE/PostTime)[1]', 'VARCHAR(23)'),
@eventdata.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/TargetObjectName)[1]', 'sysname'),
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 349
|
.query used in place of .value in code sample
On page 349, the second line of the code sample before Table 8-11 reads:
CAST(eventdata.query('data(//TSQLCommand)') AS NVARCHAR(2000))It should read:
eventdata.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'NVARCHAR(MAX)')
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 350
|
.query used in place of .value in listing 8-12
On page 350, lines 31-34 of Listing 8-12 read:
CAST(@eventdata.query('data(//PostTime)') AS VARCHAR(23)),
CAST(@eventdata.query('data(//EventType)') AS sysname),
CAST(@eventdata.query('data(//LoginName)') AS sysname),
CAST(@eventdata.query('data(//ObjectName)') AS sysname),
CAST(@eventdata.query('data(//LoginType)') AS sysname),
They should read:
@eventdata.value('(/EVENT_INSTANCE/PostTime)[1]', 'VARCHAR(23)'),
@eventdata.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/LoginType)[1]', 'sysname'),
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 353
|
"unsafe" used in place of "external"
On page 353, the line comment in the first code sample reads:
"-- Create login and grant it with unsafe permission level"It should read:
"-- Create login and grant it with external permission level"
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 354
|
Comments in code sample incorrect
On page 354, the first comment in the code sample reads:// Check whether the action is InsertIt should read:
// Check type of action
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 357
|
Comment in code sample incorrect
On page 357, the first line comment in the second block of code reads:' Check whether the action is InsertIt should read:
' Check type of action
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 373
|
'Version 2' referenced rather than 'Version 1'
On page 373, the second sentence from the end of the page reads:
"You get the output 'Version 2', and the process keeps a shared lock on the data because the transaction is still open."
It should read:
"You get the output 'Version 1', and the process keeps a shared lock on the data because the transaction is still open."
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 374
|
'Version 2' referenced rather than 'Version 1'
On page 374, the second sentence on the page reads:
"You still get 'Version 2' back, meaning you got a repeatable read even though another process attempted to change the data in between your reads."
It should read:
"You still get 'Version 1' back, meaning you got a repeatable read even though another process attempted to change the data in between your reads."
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 388
|
Column name used is incorrect
On page 388, the second paragraph under Deadlock with a Single Table reads:
"Before I demonstrate such a scenario, let's first run the following UPDATE statement to make sure that T1.col2 is set to 102 where keycol =2:"
It should read:
"Before I demonstrate such a scenario, let's first run the following UPDATE statement to make sure that T1.col1 is set to 102 where keycol =2:"
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 405
|
Missing phrase "code before the" in TRY block explination
On page 405, the first sentence of the last paragraph reads:
"The TRY block then sets @retry to 0 so that if all goes well, there won’t be another retry."
It should read:
"The code before the TRY block then sets @retry to 0 so that if all goes well, there won’t be another retry."
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 435
|
"off" used in place of "on"
On page 435, the comment in the third code sample block from the bottom reads:-- Create the Inventory Queue which will be the target of-- the conversations. This is created with activation off.It should read:
-- Create the Inventory Queue which will be the target of-- the conversations. This is created with activation on.
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 439
|
Comment in code sample is incorrect
On page 439, the second block comment in the code sample reads:-- Create the initiator queue. Activation is configured-- but turned offIt should read:
-- Create the initiator queue. This is created with activation on.
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 440
|
"Hello World" used in place of "Inventory"
On page 440, the third line comment from bottom of code sample reads:-- Begin a dialog to the Hello World ServiceIt should read:
-- Begin a dialog to the Inventory Service
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 446
|
Certificate name incorrect
On page 446, the first sentence of the third paragraph reads:"The private key certificate corresponding to the REMOTE SERVICE BINDING user of the initiator must have CONTROL permission on the target service, and the public key certificate corresponding to the initiator service owner’s certificate must have SEND permissions on the
target service."
It should read:
"The private key certificate corresponding to the REMOTE SERVICE BINDING user's certificate must have CONTROL permission on the target service, and the public key certificate corresponding to the initiator service owner’s certificate must have SEND permissions on the
target service."
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 452
|
the word "Account" missing from code comment
On page 452, the last code line comment on the page reads:-- Grant Local System connect privilegeIt should read:
-- Grant Local System Account connect privilege
|
Microsoft Press |
May 06, 2010 |
|
| Printed |
Page 473
|
Comment text is incorrect
On page 473, the 13th code line from the bottom of the page reads:// Check whether the action is InsertIt should read:
// Check type of action
|
Microsoft Press |
Jul 13, 2010 |
|
| Printed |
Page 480
|
Comment text is incorrect
On page 480, the 17th line from the bottom of the page reads:
' Check whether the action is InsertIt should read:
' Check type of action
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.
|
Microsoft Press |
May 06, 2010 |
|
|