爲什麼SQL服務器的行爲如此。我正在SQL 2005上運行此操作。在SQL中使用危險的IN子句
IN子句不驗證子查詢中的列名,但在外部查詢中針對表名驗證它爲 。這是越來越
Create table #table1(col1 int, col2 char(10), col3 char(15));
Create table #table2(col10 int, col11 char(10), col2 char(15));
insert into #table1(col1, col2, col3)
select 1, 'one', 'three'
insert into #table1(col1, col2, col3)
select 2, 'two', 'three'
insert into #table1(col1, col2, col3)
select 3, 'three', 'four'
insert into #table2(col10, col11, col2)
select 1, 'one', 'three'
insert into #table2(col10, col11, col2)
select 2, 'two', 'three'
insert into #table2(col10, col11, col2)
select 3, 'three', 'four'
select * from #table1
where col1 IN
(select col1 from #table2)
的一個例子,如果我只是選擇「選擇#表2 COL1」並運行它吐出一個錯誤
Msg 207, Level 16, State 1, Line 1
Invalid column name 'col1'.
這允許您通過外部查詢過濾子查詢中的數據,並使用此數據返回表達式。期望Sql Server認爲'col1'無效,但'col1 * col10'是有效的。 –
根據'#table2'的定義,該表中沒有'col1' - 這就是出現錯誤的原因。 –
你可能只是看了一下查詢計劃,發現它並不考慮col1在第二個表中 - 請參閱[這個屏幕截圖](http://i49.tinypic.com/2rfvl37.png) - 查看Predicate部分。 – Bridge