FIX: SQL Server 6.0 Service Pack 1 Fixlist
ID: Q136575
|
The information in this article applies to:
-
Microsoft SQL Server version 6.0
The following is a list of fixes and other various improvements that have
been made in the Microsoft SQL Server version 6.0 Service Pack 1. Service
Pack 1 is now available from your primary support provider. For more
information, contact your primary support provider.
Please note that workarounds described have been provided for your
information only. It is not necessary to implement these workarounds if
you have the updated software.
LIST OF PROBLEMS CORRECTED IN SERVICE PACK 1
DB-LIBRARY COMPONENTS
- FIX: Memory Leak in NTWDBLIB.DLL on Failed dbopen()
NETWORK-LIBRARY COMPONENTS
- FIX: ODBC 6.0 Driver Sometimes Cannot Get Results w/ dbmsspx3
ODBC COMPONENTS
- FIX: Updating a Text Column Results in a Table Scan
- FIX: Cannot Insert BLOB Data Larger Than 128k w/ SQLSetParam
REPLICATION COMPONENTS
- FIX: Repl Synch Fails with Table Names That Have Ext Chars
SERVER COMPONENTS
- FIX: EXECUTE Command w/ a Local Variable Can Cause Thread AV
- FIX: DUMP DATABASE w/ Variable Device Name in SP May Cause AV
- FIX: IN Condition with More Than 15 Values May Fail
- FIX: Unexpected Behavior During Object Resolution
- FIX: DBCC NEWALLOC Enhanced to use RA for Performance
- FIX: Query Plan Inconsistent If Search Value > Last Step
- FIX: Optimizer Hint for Index Name Fails in View
- FIX: Open Cursor Statement in SP Sets Variables to NULL
- FIX: Lvl 16 Error on Temp Tbl From SP w/ > 64 Pgs May Cause AV
- FIX: SELECT INTO w/ Correlated Subqueries May Cause AV
- FIX: DUMPs May Halt Queries With Triggers
- FIX: Create Worktable for Oversized Table Can Stop the Server
- FIX: ALTER TABLE Allows Nulls in PRIMARY KEY
- FIX: AV When Creating Reformat Plan of SP Containing Join
- FIX: Updating a Record w/ NULL Text Field Can Cause 2574 Error
- FIX: Add Constraint Causes Identity-Column Inserts to Fail
- FIX: Cannot Create a Qualified Table With a Check Constraint
- FIX: SET ARITHABORT ON Inadvertently Causes an Insert to Fail
- FIX: Cursor Declaration In a Stored Procedure Causes Client AV
FIX: Memory Leak in NTWDBLIB.DLL on Failed dbopen()
BUG# NT: 10955 (6.00)
SYMPTOMS
A Windows 32-bit (Win32) application that uses the Microsoft SQL Server
version 6.0 NTWDBLIB.DLL file will have a memory leak of a few hundred
bytes for each failed dbopen() call.
If the Microsoft ODBC 2.50.0121 Win16 SQL Server driver is running against
a SQL Server version 6.0 database whose sp_configure network packet size is
greater than 512 bytes, the following error occurs:
szSqlState="01000", pfNativeError = 253,
szErrorMsg="[Microsoft][ODBC SQL Server driver][DBMSSPX3]
ConnectionRead(SPXListenForSequencedpacket())."
The default for the sp_configure packet size on installation is 4096, so
new SQL Server version 6.0 sites may see this problem the first time they
attempt to access the server from a data source configured to use the Win16
driver and DBMSSPX3.
The problem does not occur with the Win32 ODBC driver. It does not
occur if the application is accessing a version 4.21a server since the
4.21a servers always run with a 512 packet size which is not configurable.
The problem does not occur with dblib clients, such as the SQL Server
utilities.
The key to determining if this is the specific error encountered is
to confirm that the pfNative error returned by the driver is 253. A
Novell 253 error on a SPXListenForSequencedpacket call indicates that
an overflow has occurred on a network packet buffer. Other problems,
such as network configuration problems, may generate the same
SqlState and ErrorMsg values, but they will generally have different
pfNative values.
When you use the SQL Server ODBC driver version 2.50.0121 to update a text
column, the update may take a very long time.
When you connect to SQL Server version 4.21a using the 2.50.0121
SQL Server ODBC driver and use the SQLSetParam function to insert
image or text data where the total size (such as the cbcoldef
argument for SQLSetParam) is larger than 128K, you will receive
the following error message from the SQL Server driver:
[Microsoft][ODBC SQL Server Driver][SQL Server] Memory request failed
because more than 64 pages are required to run the query in its
present form. The query should be broken up into shorter queries if
possible[#703].
Replication fails when a table name contains extended characters and
the subscriber is an ANSI server.
Invalid syntax when you build an EXECUTE statement from a local
variable can cause a thread access violation (AV).
The access violation can be generated when Microsoft SQL Server version 6.0
attempts to resolve a stored procedure name that was built in a declared
variable. SQL Server generates a thread access violation and aborts the
connection.
DUMP DATABASE to a device that uses the format
dump_device = @dump_device_namevar
causes a handled access violation if used within a stored procedure.
If the IN conditional expression of the WHERE clause contains more
then 15 constants and is being tested against an INT NULL column,
then it will return no rows even if there are qualifying rows.
During object resolution, Microsoft SQL Server version 6.0 may not
successfully resolve the dependency, which can cause a thread access
violation.
There are several variations of the behavior depending on whether you
are using a view or a stored procedure, and, more specifically, user
created objects. User created objects may induce errors with stored
procedure resolution.
In general, two situations that may lead to this are:
- The table is created, a view or stored procedure is created to
reference the table, and then the table is dropped. This would normally
result in an error.
- The table is created, a view or stored procedure is created to
reference the table, and then the table is dropped and recreated.
The Microsoft SQL Server version 6.0 query optimizer may sometimes choose
to use an index and sometimes choose to do a table scan when
the query WHERE clause contains a search value that is greater than the
largest distribution step for a given index, but less than the largest
value in the table for the indexed column.
When you create a view using an optimizer hint to force an index and
the index is specified by the index name, a query on that view fails
with the following error:
Msg 308, Level 16, State 1
Index '%s' on table '%s' (specified in the FROM clause) does not exist.
When you open a cursor in a stored procedure, it can set all local
variables inside the stored procedure to NULL if the DECLARE cursor
statement is the first statement in the stored procedure.
If you execute a stored procedure that makes reference to objects in TempDB
with a query plan size of 64 pages or more after you get a Level 16 Error,
a client access violation (AV) may occur.
In Microsoft SQL Server version 6.0, a SELECT INTO statement that includes
a correlated subquery using the aggregate functions SUM or AVG may cause a
client access violation (AV).
When you dump the transaction log or the database while users are running
queries which fire triggers that reference the INSERTED and DELETED
tables, this may cause the users' queries to be blocked for the duration of
the DUMP TRAN or DUMP DATABASE command.
When you attempt to create a worktable for storing intermediate results on
a query involving an ORDER BY or GROUP BY clause for an oversized table, it
can cause a server access violation.
When you create a table with a row size more than 1962 bytes, SQL Server
generates a warning that the row is oversized, yet still creates the table.
Inserting data into the table will work fine, as long as the actual data
being inserted is less than 1962 bytes.
When you SELECT the data out without an ORDER BY or GROUP BY clause, the
rows are retrieved normally, since there is no worktable involved. If a
worktable is involved for ORDER BY or GROUP BY, then the server stops;
it generates an unhandled exception, resulting in a Dr. Watson log.
The ALTER TABLE command allows the inclusion of nullable columns if used to
create a PRIMARY KEY. This should not be allowed.
A thread-level access violation (AV) can occur during creation of the
access plan of a stored procedure if the query involves three or more
tables, two of which are temporary tables.
If you insert a NULL into a text field and then update the record that
the text field belongs to and leave the text field NULL, a DBCC TEXTALLOC
will show error 2574:
Index page number %ld is empty. Status = 0x%x.
If you add a constraint to a table, it resets the identity, causing it to
insert zeros in the identity column for all subsequent table inserts.
When you attempt to create a table with the username.tablename format and a
check constraint, you can get message 15009:
The object 'username.tablename' does not exist'.
Cursor declaration inside a stored procedure with aggregates and a
variable may cause a client access violation (AV) during the execution
of the stored procedure.
MORE INFORMATION
A DB-Library (DB-Lib) program that makes a call to dbopen() using the
version of NTWDBLIB.DLL that ships with SQL Server 6.0 will leak a few
hundred bytes every time the function call fails. When viewed with the SQL
client configuration utility, WINDBVER, the version of the problem DLL is
6.00.121.
FIX: ODBC 6.0 Driver Sometimes Cannot Get Results w/ dbmsspx3
BUG# NT: 11051, 11037 (6.00)
Before you connect a SQL Server Driver version 2.50.121 or later to SQL
Server version 4.21a, make sure that the INSTCAT.SQL file that ships with
the driver has been executed on the server. The INSTCAT.SQL script upgrades
the catalog stored procedures used by the driver.
FIX: Repl Synch Fails with Table Names That Have Ext Chars
BUG# NT: 11063 (6.00)
The INSERTED and DELETED tables inside a trigger are virtual tables
created from their log entries. During a DUMP TRANSACTION or a DUMP
DATABASE command, triggers that use these tables may be blocked until
the DUMP TRANSACTION or DUMP DATABASE command is completed.
FIX: Create Worktable for Oversized Table Can Stop the Server
BUG# NT: 10083 (6.00)
Primary keys should not allow any nullable columns; this is enforced if the
key is created using CREATE TABLE. However, nullable columns were being
allowed when ALTER TABLE was used to create the PRIMARY KEY, and this
should not have been the case.
FIX: AV When Creating Reformat Plan of SP Containing Join
BUG# NT: 10300 (6.00)
CAUSE
The Microsoft ODBC 2.50.0121 Win16 SQL Server driver cannot retrieve
results from a SQL Server version 6.0 system if it is working with DBMSSPX3
network library and the server is configured to have a network packet
size larger that 512 bytes.
The driver may perform a table scan while accomplishing the update.
FIX: Cannot Insert BLOB Data Larger Than 128k w/ SQLSetParam
BUG# NT: 10224 (6.00)
This problem only occurs when the SQLSetParam function is used.
The subscriber is expecting an ANSI code page, but the table name
is stored for the replication service as an OEM code page,
and no conversion is occuring.
FIX: EXECUTE Command w/ a Local Variable Can Cause Thread AV
BUG# NT: 10191 (6.00)
The error occurs when the EXECUTE statement treats an oversized buffer
(more then 30 characters) as a stored procedure name instead of as a
specific Transact-SQL command due to the use of invalid syntax for the
EXECUTE statement itself.
For example:
use pubs
go
declare @strCommand char(128)
select @strCommand = 'select * from authors'
execute @strCommand
go
The behavior can be altered by changing the variable declarations.
DECLARATION BEHAVIOR
----------- ---------
varchar(xxx) Successful completion of command, or appropriate error
returned:
'Unable to find stored procedure 'select * from authors'
char(30) Successful completion of command, or appropriate error
returned:
'Unable to find stored procedure 'select * from authors'
char(128) Thread access violation.
The behavior does not change if you use a valid stored procedure name, such
as sp_who; char(128)continues to cause an access violation, and char(30)
continues to execute successfully. This is because char(30) is a valid
length for an object identifier.
The query optimizer incorrectly calculates the cost of using an index.
But even if the above conditions are met, the problem is still unlikely
to occur with most queries. If you suspect this problem is occurring on a
slow-running query, you should take other troubleshooting steps first,
including running the UPDATE STATISTICS statement, examining the query's
showplan output, and examining the table/index design as described in
Knowledge Base article Q110352 - "INF: Optimizing SQL Server Performance."
Microsoft SQL Server version 6.0 incorrectly interprets the optimizer hint
as an index name within a view.
All of the following conditions must exist for the client to AV:
- The query plan size of the stored procedure must be greater than 64
pages.
You can find the size of the stored procedure by compiling the stored
procedure and running the DBCC MEMUSAGE command.
- A Level 16 or greater error message inside or before executing the
stored procedure.
An example of a Level 16 Error message is a SELECT statement that
tries to access a non-existent table.
- The stored procedure must make a reference to an object in TempDB.
The specific conditions under which this problem occurs are:
- SELECT INTO statement /*the SELECT works fine without INTO clause*/
- Correlated subquery in the <select_list>
- SUM or AVG in the correlated subquery /* the statement works fine with
MIN and MAX */
This problem does not always happen, but only with certain statistical
distributions of data which cause the optimizer to build a reformat access
plan.
If the empty text page is the first page in the text chain, DBCC
TEXTALLOC will erroneously report a 2574 error.
This problem only occurs if the identity field was added by using the ALTER
TABLE statement.
The full qualified table name is not being passed to the CHECK routine, and
therefore the columns being tested do not have the base table information.
WORKAROUND
Set the SQL Server network packet size to 512 using either the SQL
Enterprise Manager, or by issuing the following command in ISQL:
sp_configure 'network packet size', 512
go
reconfigure
go
You should then stop and restart SQL Server. Other options are to use the
Win32 ODBC driver, or to use the DBNMP3 network library instead of
DBMSSPX3.
FIX: Updating a Text Column Results in a Table Scan
BUG# NT: 10959 (6.00)
Use the ODBC version 2.0 function SQLBindParameter instead of SQLSetParam.
- Ensure the syntax of the EXECUTE command is correct. If the command you
are attempting to execute is not a stored procedure, place parenthesis
around it. See "SQL Server Books Online" for the documented syntax of
the EXECUTE command. Other commands may include local variables larger
than char(30).
- Use char(30) when you execute a stored procedure to guarantee object
identifier length.
FIX: DUMP DATABASE w/ Variable Device Name in SP May Cause AV
BUG# NT: 10328 (6.00)
When used outside of a stored procedure the commands work fine. Hard coding
a device file path also works correctly.
FIX: IN Condition with More Than 15 Values May Fail
BUG# NT: 10951 (6.00)
Use an INT NOT NULL column to do these qualifications.
FIX: Unexpected Behavior During Object Resolution
Bug# NT: 10252 (6.00)
Drop and recreate the object(s) which rely on the missing or changed
dependency object.
FIX: DBCC NEWALLOC Enhanced to use RA for Performance
BUG# NT: 10330 (6.00)
You can run the DBCC CHECKALLOC statement instead of DBCC NEWALLOC, which
does use the RA and provides similar functionality.
FIX: Query Plan Inconsistent If Search Value > Last Step
BUG# NT: 10264 (6.00)
Use optimizer hints to force a given query plan.
FIX: Optimizer Hint for Index Name Fails in View
BUG# NT: 10266 (6.00)
In the optimizer hint, specify the index using the index id instead
of the index name when you create the view. The index id can be obtained
by querying the sysindexes system table.
FIX: Open Cursor Statement in SP Sets Variables to NULL
BUG# NT: 11170 (6.00)
Either of the following methods can be used to work around this problem:
Do not use the DECLARE cursor statement as the first statement in
the stored procedure.
-OR-
Issue the DECLARE cursor statement inside an EXECUTE statement as follows:
EXEC ("DECLARE mycursor cursor for SELECT au_lname from authors")
FIX: Lvl 16 Error on Temp Tbl From SP w/ > 64 Pgs May Cause AV
BUG# NT: 10213 (6.00)
Reduce the size of the stored procedures such that their individual
sizes are less than 64 pages.
EXAMPLE:
Assume that the following stored procedure has a size greater than 64
pages.
Create Procedure Get_Account_Information <Parameters> as
Begin
<Several Data Manipulation Statements say 1 through 10>
<Several Data Manipulation Statements say 11 through 20>
End
You can reduce the size of the above stored procedure by creating
two stored procedures each having a size less than 64 pages. Keep the
name of this stored procedure the same as the original one to avoid code
changes to the scripts that call this stored procedure.
Create Procedure Get_Account_Information <Parameters> as
Begin
<Data Manipulation Statements 1 through 10>
exec Get_Account_Information_Part2 <Parameters>
/** Keep these parameters exactly the same as the exec
statement that called Get_Account_Information **/
End
Create Procedure Get_Account_Information_Part2 <Parameters> as
Begin
<Data Manipulation Statements 11 through 20>
End
If the original stored procedure has an OUTPUT parameter, return that
parameter back from Get_Account_Information_Part2 to
Get_Account_Information and then back to the caller of
Get_Account_Information.
FIX: SELECT INTO w/ Correlated Subqueries May Cause AV
BUG# NT: 11058 (6.00)
The correlated subquery works when MAX or MIN is the aggregate function.
However, when the AVG or SUM functions are used, then you should not use
the correlated query, but split the query and use GROUP BY in the first
query, get those results, and join with the tables in the second query to
achieve the same results as in the correlated subquery.
FIX: DUMPs May Halt Queries That Have Triggers
BUG# NT: 11085 (6.00)
Ensure that the base table is not created to be larger than the maximum
size of a row. Alternately, do not use ORDER BY or GROUP BY in SELECT
statements that operate on oversized tables.
FIX: ALTER TABLE Allows Nulls in PRIMARY KEY
BUG# NT: 10968 (6.00)
There are three possible ways to avoid this problem.
- Create the temporary tables within the stored procedure.
- Use permanent tables instead of temporary tables.
- Use an optimizer hint on the temporary tables to force a table scan. See
the SQL Server version 6.0 documentation for details on using optimizer
hints.
FIX: Updating a Record w/ NULL Text Field Can Cause 2574 Error
BUG# NT: 9691 (6.00)
The error message is an erroneous error message and therefore is no
cause for concern. To clear the message, you can move the date using
bcp, transfer manager, or a SELECT INTO. You can also update the record
and include valid, not null data for the text field.
FIX: Add Constraint Causes Identity-Column Inserts to Fail
BUG# NT: 11057 (6.00)
Move the data into a holding place with a SELECT INTO. Drop and recreate
the table with the CONSTRAINT or IDENTITY in place from the beginning. Or,
you can use a trigger temporarily to perform the check function.
FIX: Cannot Create a Qualified Table With a Check Constraint
BUG# NT: 9781 (6.00)
Where possible, refrain from using the qualified table name or use a
trigger instead of the check constraint. If the qualified table name is
necessary, use the SETUSER function to impersonate the table owner.
FIX: SET ARITHABORT ON Inadvertently Causes an Insert to Fail
BUG# NT: 9952 (6.00)
Perform an initial SELECT with the entire WHERE clause and INSERT into a
temporary table, such as:
insert <temp storage> select <cols>
from <table> where <clauses>
followed by DECLARE CURSOR from the temporary table:
declare cursor for select col1 = sum(...)
from <temp storage>
SUMMARY
The Read Ahead Manager (RA) is a mechanism unique to SQL Server version 6.0
which independently pre-fetches pages from disk to the buffer cache
anticipating a query thread's request for additional pages. The DBCC
NEWALLOC command has been enhanced to use this feature, resulting in
improved performance.
You can use the ARITHABORT option to terminate a query when an overflow or
divide-by-zero error occurs during query execution. With the new decimal
and numeric datatypes, the ARITHABORT does not allow you to abort the loss
of the most significant digit and ignores the loss of the least significant
digit. Thus, the ARITHABORT option may raise a message 8115:
Arithmetic overflow error converting numeric to type numeric.
A new SET option NUMERIC_ROUNDABORT has been added to abort the truncation
of numeric values. This option specifies the behavior following a loss of
scale for an exact numeric type during conversion. By default this option
is OFF allowing SQL Server to round the numeric result and continue
processing. When this option is ON, SQL Server aborts the statement/query
that caused the error.
FIX: Cursor Declaration In a Stored Procedure May Cause Client AV
BUG# NT: 11169 (6.00)
Additional query words:
buglist patch service pack
Keywords : SSrvGen
Version : 6.0
Platform : WINDOWS
Issue type :
Last Reviewed: April 14, 1999