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与查询表COLUMN位于不同的数据库中。FROM

如果我将第 3 行更改为读取,(Order By [tbl1].[col1] ASC)那么它可以毫无问题地运行。仅当排序列位于不同的数据库中时才会发生该错误。

有谁知道为什么会这样?对于如何解决这个问题,有任何的建议吗?

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-tbl2是否有可能你在另一个数据库中同时拥有 atb2和 a tbl2,并且你引用了错误的那个?

编辑我创建了这个:

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. 它运行良好。所以最后一次我会建议你没有告诉我们关于模式的一些事情,或者你已经混淆了名称的事实(并且已经不得不纠正一个错字)已经混淆了太多东西甚至对你...

于 2012-05-31T18:33:26.557 回答