SQL Server 2008 Management Studioで次の問題が検出されました。次のスクリプトを全体として実行すると、エラーが発生する(「コピー&ペーストエラー」が原因である)ので、受け取ることはできません。SQL Tempテーブルがスローされない無効な列名エラーが発生したとき
IF OBJECT_ID('Foo') IS NOT NULL
BEGIN
DROP TABLE Foo
END
IF OBJECT_ID('Bar') IS NOT NULL
BEGIN
DROP TABLE Bar
END
CREATE TABLE Foo (
FooID int
)
Create Table Bar (
BarID int
, FooID int
)
INSERT INTO Foo
SELECT 1 UNION ALL SELECT 2
INSERT INTO Bar
SELECT 1,1 UNION ALL SELECT 2,1 UNION ALL SELECT 3,1
GO
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
BEGIN
DROP TABLE #TEMP
END
GO
CREATE TABLE #TEMP (
FooID int
)
INSERT INTO #TEMP
SELECT FooID FROM Bar
GO
SELECT * FROM Foo WHERE FooID IN (SELECT FooID FROM #TEMP)
GO
SELECT * FROM Bar WHERE BarID IN (SELECT BarID FROM #TEMP)
GO
SELECT * FROM #TEMP
GO
含む第二の最後の文は、「#TEMP FROM SELECT BarID」のwhere句のフィルタが実行されますが、#TEMPにはBarID列はありません。スクリプト全体を実行するとエラーはなく、スクリプトはFooのすべての行を返します。しかし、自分でコマンドを実行すると、#TEMPにBarIdがないことを知らせるエラーが表示されます。
これには理由がありますか?それは私のコードですか?
BarIDが#TEMPにないことがわかっている場合、#TEMPからBarIDを選択する理由は何ですか? – Paparazzi
私の質問では、私のところではエラーだと言いました。問題は私のコードがどれほど有効ではないのですが、なぜエラーがスローされなかったのですか?これはNeilによって回答されます – littlechris