2017-06-22 16 views
0
USE DATABASE 

insert into #Table -- Previously created temp table 
(
    Name 
    Number 
    Date 
) 

select 'Joe', 5, 'January 9th' 
union all select 'Sam', 3, 'January 4th' 
union all select 'Eleanor', 4, 'January 5th' 
union all select 'Joseph', 1, 'January 6th' 

私の質問は、selectに挿入すると、情報が来るデータベースのテーブルを明確に示す 'from'ステートメントが指定されていない場合ですから?SQLの使用範囲ステートメント&選択範囲に挿入

私はこれに似たselect文に遭遇しました。データが4つのselect文で作成されている場合や、データベースで検索されている場合は理解できません。それが検索されている場合、Microsoft SQL Server Managementスタジオはどのテーブルが参照されているかを知っていますか?

答えて

0

FROM句がない場合、データはどのデータベースのどのテーブルからも得られません。これはINSERTクエリにハードコードされています。データを挿入するテーブルがどのように分かっているかを尋ねるなら、それはINSERT INTO句で指定され、USEステートメントの文脈にあります。

「以前に作成した」とコメントした一時表に挿入するため、一時表のスコープはまったく別の問題であるため、疑問に思っています。

+0

の#Tableへの挿入のすぐ上に、そのテーブルが作成されるcreate tableステートメントがあります。したがって、fromステートメントがなければ、selectステートメントはデータベース内の値を検索するのではなく、それらの行のデータを作成してテーブルに挿入することです。 – Zion

+0

はい、あなたの理解は正しいです。なんで聞くの?予想外の結果やエラーが表示されますか? –

+0

完全なスクリプトは非常に長く、その組合の何百もがすべて選択されていますし、さらに少なくとも100行の選択文があり、その後に値がどこから来たのかを明示する「from」ステートメントがあります。最初の数行を見ることで何かを選んで何かを選んだのですが、私はSQLの初心者ですが、マイナーアップデートと思われていたものを実行することを任されています – Zion

1

USE databaseに続くすべてが、選択したデータベースのコンテキストで実行されます。この場合

あなた#tempテーブルは関係なく、どのデータベースのtempdbに格納されているため、USEあなたはを使用してだ、何も達成していない、とあなたの選択は、任意のテーブルにアクセスしていないので、それは関係なく、ハードコードされた値を返します。データベースコンテキストにも適用されます。

+0

ハードコードされた値の復帰は、知っておかなければならないので、from句がないUSEステートメントに関係なく、selectに挿入するとハードコーディングされた値がテーブルに配置されます。 – Zion

+0

@Zion正確に言えば、次の 'USE'文までは現在使用されているdbですべてが実行され、' FROM'では3つの部分からなる名前が付けられます(FROM [Database]。[Schema ]。[テーブル] '。 –