2016-07-06 35 views
1

SQL Serverのテーブル値関数では、次のようなものを実行すると、(スカラー値関数の)変数と同様に、テンポラリテーブル@Tableが作成されます。そのような声明の多くが実行されるなら、どんな問題も起こるでしょうか?SQL Serverのテーブル値関数。関数内のテーブルは一時的なものですか?

CREATE FUNCTION some_function 
    (@some_var varchar(20), @someDate date) 
RETURNS @Table Table (id int, name varchar(50), DoB date) 
AS 
BEGIN 
    INSERT INTO @Table 
     SELECT id, Name, CAST(DoB as date) 
     FROM tblEmployees 

    RETURN 
END 
+0

これは一時テーブルではなく、単なる変数です。しかしこの例では、あなたはそれを必要としません。インライン関数を作成し、結果を直接返すことができます。これにより、オプティマイザは、より良いプランを作成し、変数を最初に変数にコピーすることを保存します。 –

+0

DBA.SEでこの回答をお読みください。http://dba.stackexchange.com/questions/16385/ SQL Serverのテーブルとテーブルの間で違いがあります – TheGameiswar

+0

ここを見てくださいhttps://blogs.msdn.microsoft.com/naga/2015/05/10/sql/ –

答えて

1

多く、このような文が実行されるならばすべての問題が発生するでしょうか?

いいえ、それはnot possibleある:

ローカル変数のスコープは、それが宣言されているバッチです。

テーブル変数のスコープは、スカラー変数と同じです。

About table variableと一時テーブル、簡単:

ローカル・テンポラリ・テーブルは、特定のSPIDに制限されながら、テーブル変数の範囲は、特定のバッチに制限されます。各スレッドは独自のspidを持っていますので、彼らは、#テーブル名に競合することはありません - あなたが複数のスレッドから同じコードを実行している場合でも、意味

。異なるユーザー(異なる接続)は、一時変数テーブル名(異なる接続に対しては不可能)でもテーブル変数名(全く可能ではない)にも競合することはできません。

##(グローバル・テンポラリ・テーブル)と#(同じ名前のテンポラリ・テーブルを作成しようとしているネストされたプロシージャ)内の競合のみが可能です。

関連する問題