2016-11-16 116 views
1

我已經聲明瞭一個存儲過程,即在一臺本地服務器表聲明的表變量:SQL服務器:加入

DECLARE @fooTable table (idfoo INT) 

INSERT INTO @fooTable 
    EXEC getBOO 

SELECT * FROM @fooTable 

我想加盟此表與其他表從我的本地服務器數據庫即:

SELECT * 
FROM tbl1 
RIGHT JOIN tbl2 ON tbl1.foofield = tbl2.foofield 
RIGHT JOIN @fooTable ON tbl2.foofield = @fooTable.foofield ; 

我得到一個錯誤:

Must declare the scalar variable "@fooTable"

我搜索了一下這個錯誤,大部分職位的,我發現狀態d我試圖達到的表格超出範圍。

那麼聲明@fooTable,以及JOIN查詢,是同一存儲過程的一部分,所以我找不到任何範圍問題。

JOIN一個變量表(@fooTable)與我的本地服務器中的表的最佳做法是什麼? (tbl1,tbl2)?

+1

爲表變量 – mansi

回答

3

只要給一個Alias名稱表變量,並用它作爲參考

SELECT * 
FROM tbl1 
     RIGHT JOIN tbl2 
       ON tbl1.foofield = tbl2.foofield 
     RIGHT JOIN @fooTable FT -- Here 
       ON tbl2.foofield = FT.foofield; 
           --^^-- Here 
1

您需要爲表變量提供別名

SELECT * 
FROM tbl1 RIGHT JOIN tbl2 
ON tbl1.foofield = tbl2.foofield 
RIGHT JOIN @fooTable FooTable 
ON tbl2.foofield = FooTable.foofield; 
4
DECLARE @fooTable table (idfoo INT) 
INSERT INTO @fooTable 
EXEC getBOO 
SELECT * FROM @fooTable 

SELECT * 
FROM tbl1 RIGHT JOIN tbl2 
ON tbl1.foofield = tbl2.foofield 
RIGHT JOIN @fooTable f2 
ON tbl2.foofield = f2.idfoo ; 
+0

給別名應該運行整個語句 – brahmareddy

1

這裏的問題是兩個表具有相同名稱和類型的關係操作(聯合)。在1992年,當引入新的連接語法(NATURAL,USING等)時,此問題得以解決。你的查詢可以固定在這樣:

SELECT * 
    FROM tbl1 
     NATURAL RIGHT JOIN tbl2 
     NATURAL RIGHT JOIN @fooTable; 

但是,SQL Server沒有采用1992年加入類型,所以我們堅持用SQL的原始分辨率,可以追溯到20世紀70年代:範圍變量。 [其他人在這裏爲相同的概念使用不適當的術語'別名'。]要清楚:用戶是要求使用範圍變量來解決'共同名稱'問題。

雖然您可能沒有意識到,但您在代碼中使用了範圍變量,例如在線路

ON tbl1.foofield = tbl2.foofield 

tbl1tbl2是範圍變量:各自表示它的範圍在表的行。因爲你沒有指定自己的範圍內的變量名,表名被使用(這同樣在20世紀70年代SQL它的根),即相當於:

SELECT * 
FROM tbl1 tbl1 
     RIGHT JOIN tbl2 tbl2 
     ON tbl1.foofield = tbl2.foofield 

我猜出你的代碼是倒下的這@fooTable是不是即

RIGHT JOIN @fooTable @fooTable 

因此,一個有效的範圍變量名,解決方法是選擇一個範圍變量名,使SQL Server的快樂如

SELECT * 
    FROM tbl2 t2 
     RIGHT JOIN @fooTable f 
      ON t2.foofield = f.foofield 

我首選的方案是爲SQL Server實現1992年的連接類型!不在我的控制範圍內,但我已投了票here