0

SQL Server(2008)で次のクエリを送信しています

WITH query AS (SELECT TOP 100 PERCENT
    ROW_NUMBER() OVER
    (ORDER BY [tbl2].[col2] ASC) AS TableRowNumber ,
    [tbl1].[col1] ,
    [tbl2].[col2]
FROM [db1].[dbo].[tbl1] AS [tbl1]
JOIN [db2].[dbo].[tbl2] AS [tbl2]
    ON [tbl1].[id] = [tbl2].[id])

SELECT
    *
FROM query
WHERE TableRowNumber BETWEEN 1 AND 15
ORDER BY TableRowNumber ASC

このクエリを実行すると、次のエラーメッセージが返されます。

Msg 207, Level 16, State 1, Line 3
Invalid column name 'col2'. 

SQL結合自体は正常に実行されます(通常のクエリとして実行する場合。問題は、クエリのテーブルとは異なるデータベースにあるRow_Number() over (Order By COLUMN)whenを使用することにあるようです。COLUMNFROM

3行目を読むように変更すると(Order By [tbl1].[col1] ASC)、問題なく実行されます。このエラーは、ソート列が別のDBにある場合にのみ発生します。

なぜこれが起こっているのか誰かが知っていますか?これを修正する方法について何か提案はありますか?

4

1 に答える 1

8

これは私にとっては問題ありません:

SELECT a.name, b.object_id, rn = ROW_NUMBER() OVER (ORDER BY b.object_id DESC)
  FROM sys.columns AS a 
  INNER JOIN tempdb.sys.objects AS b
  ON a.object_id = b.object_id;

したがって、他の問題が発生しているのではないかと思います(たとえばcol2、実際には存在しません)。tb2また、あなたがそのことを呼んでいることに気づきました-他のデータベースにaとaのtbl2両方があり、間違ったものを参照している可能性はありますか?tb2tbl2

編集私はこれを作成しました:

CREATE DATABASE db1;
GO
USE db1;
GO
CREATE TABLE dbo.tbl1(ID INT, col1 INT);
GO
INSERT dbo.tbl1 SELECT 1, 5
UNION ALL SELECT 2, 10;
GO
CREATE DATABASE db2;
GO
USE db2;
GO
CREATE TABLE dbo.tbl2(ID INT, col2 INT);
GO
INSERT dbo.tbl2 SELECT 1, 9
UNION ALL SELECT 2, 4;
GO
USE db1;
GO

次に、のコンテキストでクエリを実行しましたdb1。うまくいきました。したがって、最後に、スキーマについて教えていないことがあるか、名前を難読化した(そして、すでに1つのタイプミスを修正しなければならなかった)という事実が何かを難読化しすぎていることをお勧めします。あなたにとっても...

于 2012-05-31T18:33:26.557 に答える