Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion Groups
DB Engine
SQL ServerMSDESQL Server CE
Services
Analysis (Data Mining)Analysis (OLAP)DTSIntegration ServicesNotification ServicesReporting Services
Programming
CLRConnectivitySQLXML
Other Technologies
ClusteringEnglish QueryFull-Text SearchReplicationService Broker
General
Data WarehousingPerformanceSecuritySetupSQL Server ToolsOther SQL Server Topics
DirectoryUser Groups
Related Topics
MS AccessOther DB ProductsMS Server Products.NET DevelopmentVB DevelopmentJava DevelopmentMore Topics ...

SQL Server Forum / DB Engine / SQL Server / January 2008

Tip: Looking for answers? Try searching our database.

HELP : Remote query from 2005 to 2000 returns wrong recordset when     TABLE CONSTRAINTS exist

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
EricBello@eurofins.com - 31 Jan 2008 14:57 GMT
Hi there

I came across this bug and could not find a solution, and I'm blocked.
Can anyone help ?

I have a table with TABLE CONSTRAINT, located at a SQL 2000 (SP3 or
SP4) server.

When I make a remote query from a (linked) SQL 2005 server (SP1 or
SP2), the returned recordset is totally wrong (rows are missing).

The problem does not occur between two SQL 2000, nor between two SQL
2005.
Russell Fields - 31 Jan 2008 15:47 GMT
Eric,

Can you define the condition of the missing rows better?  That might give a
clue.

One suggestion is to compare the collations of the SQL 2000 server and
database with the collations of the SQL 2005 server and database.  If that
is a problem, you might be able to resolve it with a COLLATE clause in the
query.

RLF

> Hi there
>
[quoted text clipped - 9 lines]
> The problem does not occur between two SQL 2000, nor between two SQL
> 2005.
EricBello@eurofins.com - 31 Jan 2008 15:53 GMT
The collations are the same.
I really suspect a bug like the one on the optimizer that considered
some constraints trustworthy whereas they were "not for replication".
EricBello@eurofins.com - 31 Jan 2008 16:12 GMT
I drilled down to the execution plan, and I can clearly see the
optimizer including the condition "where ...packageSqlId = 1121",
which shows it actually considers the table constraint
"trustworthy" (or sth alike) and restricts the recordset accordingly.
erbellico@gmail.com - 31 Jan 2008 17:22 GMT
The missing rows are those that don't comply with the TABLE CONSTRAINT.
Russell Fields - 31 Jan 2008 21:45 GMT
Eric,

Sorry, I really don't know.  I used your repro script and get the same
results that you do.

Other things that I tried, on the SQL 2000 server create the RemoteServer
linked server pointing back to itself. Here were my results trying this:

SQLOLEDB connection:  Returned 3 as desired.
SQLNCLI connection:  I get the following error

OLE DB error trace [Non-interface error:  Column 'packageTranslationName'
(compile-time ordinal 5) of object '"pubs"."dbo"."MyPackagesTranslations"'
was reported to have changed. The exact nature of the change is unknown].
Msg 7356, Level 16, State 1, Line 1
OLE DB provider 'SQLNCLI' supplied inconsistent metadata for a column.
Metadata information was changed at execution time.

And, no matter what I try from the SQL 2005 server, I always get 0 returned.
In addition to SQLNCLI connect, I tried to script in a SQLOLEDB connect, but
it converted to SQLNCLI.  I tried creating the remote server using the SQL
Server radio button, also.  No change in query result.

Is SQLNCLI at the root of the problem?  I don't know enough to say.

So, I would say that you have probably found a bug that you could choose to
report to Microsoft.    At least a bit of googling did not help me find an
answer.

RLF

> The missing rows are those that don't comply with the TABLE CONSTRAINT.
EricBello@eurofins.com - 31 Jan 2008 15:51 GMT
Here is the script to reproduce the problem

At SQL 2000 side (SP3 or SP4) :

--cleanup
--DROP TABLE MyPackagesTranslations
--DROP TABLE MyPackages
GO
USE pubs
GO
SET ANSI_NULLS, QUOTED_IDENTIFIER ON
GO
-- Create the table MyPackages,
CREATE TABLE [dbo].[MyPackages](
   [packageIncId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
   [packageSqlId] [smallint] NOT NULL CONSTRAINT
[DF_MyPackages_packageSqlId] DEFAULT (1121),
   [packageName] [nvarchar](60) NULL,
   [isDeleted] [bit] NOT NULL CONSTRAINT
[DF_MyPackages_isDeleted_Default] DEFAULT (0x00),
   CONSTRAINT [PK_MyPackages] PRIMARY KEY CLUSTERED
   (
       [packageIncId] ASC,
       [packageSqlId] ASC
   )
)
GO
-- Create linked table MyPackagesTranslations
CREATE TABLE [dbo].[MyPackagesTranslations](
   [packageTranslationIncId] [int] IDENTITY(1,1) NOT FOR REPLICATION
NOT NULL,
   [packageTranslationSqlId] [smallint] NOT NULL CONSTRAINT
[DF_MyPackagesTranslations_packageTranslationSqlId] DEFAULT (1121),
   [packageIncId] [int] NOT NULL,
   [packageSqlId] [smallint] NOT NULL,
   [packageTranslationName] [nvarchar](60) NULL,
   CONSTRAINT [PK_MyPackagesTranslations] PRIMARY KEY CLUSTERED
   (
       [packageTranslationIncId] ASC,
       [packageTranslationSqlId] ASC
   )
)
GO
-- ... with a foreign key between them
ALTER TABLE [dbo].[MyPackagesTranslations] WITH NOCHECK ADD CONSTRAINT
[FK_MyPackagesTranslations_MyPackages]
FOREIGN KEY([packageIncId], [packageSqlId])
REFERENCES [dbo].[MyPackages] ([packageIncId], [packageSqlId])
NOT FOR REPLICATION
GO
ALTER TABLE [dbo].[MyPackagesTranslations] CHECK CONSTRAINT
[FK_MyPackagesTranslations_MyPackages]
GO

-- Insert some data with "packageSqlId = 1"
INSERT MyPackages (packageSqlId, packageName) VALUES (1, 'Foo')
INSERT MyPackages (packageSqlId, packageName) VALUES (1, 'Bar')
INSERT MyPackages (packageSqlId, packageName) VALUES (1, 'Cat')

INSERT MyPackagesTranslations (packageIncId, packageSqlId,
packageTranslationName)
SELECT packageIncId, packageSqlId, 'Translated ' + packageName
FROM dbo.MyPackages
GO

-- Now Add a CHECK CONSTRAINT for MyPackages.packageSqlId = 1121
ALTER TABLE [dbo].[MyPackages] WITH NOCHECK ADD CONSTRAINT
[CK_MyPackages] CHECK NOT FOR REPLICATION
(([packageSqlId] = 1121))
GO
ALTER TABLE [dbo].[MyPackages] CHECK CONSTRAINT [CK_MyPackages]
GO

=> And now at SQL 2005 side (SP1 or SP2)

Execute the query :
-- Now connect to another server with SQL 2005 SP1 or SP2, and launch
the remote query
-- (first verify you have a linked server)
SELECT count(*)
from <remoteserver>.pubs.dbo.MyPackages pack
INNER JOIN <remoteserver>.pubs.dbo.MyPackagesTranslations trans
ON (pack.packageIncId=trans.packageIncId and
pack.packageSqlId=trans.packageSqlId)
where pack.isDeleted=0x0
--=> returns "0" (KO) : should be "3"
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.