2011-11-02 6 views
17

テーブル値関数でテンポラリテーブルを使用しようとしていますが、それはできないようです。テーブル値関数で一時テーブルを使用できる他の方法はありますか?テーブル値関数でテンポラリテーブルを使用する

CURRENT CODE:

CREATE FUNCTION dbo.fnt_AllChildren (#ParentName VARCHAR(255)) 
    RETURNS @return_variable TABLE 
    (
     Id INT, 
     Name VARCHAR(255), 
     ParentId INT, 
     ParentName VARCHAR(255) 
    ) 
AS 
BEGIN 
    CREATE TABLE #Child (Id INT, Name VARCHAR(255), ParentId INT, ParentName VARCHAR(255)) 
    CREATE TABLE #Parent (Id INT, Name VARCHAR(255), ParentId INT, ParentName VARCHAR(255)) 


    INSERT #Child (Id, Name, ParentId, ParentName) 
    SELECT child.Id, child.Name, child.ParentId, parent.Name 
    FROM dbo.t_mytable child 
    INNER JOIN dbo.t_mytable parent ON child.ParentId = parent.Id 
    WHERE parent.Name = #ParentName 

    WHILE (@@ROWCOUNT > 0) 
    BEGIN 
     INSERT INTO @return_variable 
     SELECT * FROM #Child 

     DELETE FROM#Parent 

     INSERT INTO #Parent 
     SELECT * FROM #Child 

     DELETE FROM #Child 

     INSERT INTO #Child (Id, Name, ParentId, ParentName) 
     SELECT child.Id, child.Name, child.ParentId, parent.Name 
     FROM dbo.t_mytable child 
     INNER JOIN #Parent parent ON child.ParentId = parent.Id 
    END 
    RETURN 
END 
GO 

答えて

23

あなたが代わりにtable variableを使用することができます。

DECLARE @Child TABLE (Id INT, Name VARCHAR(255), ParentId INT, ParentName VARCHAR(255)) 
DECLARE @Parent TABLE (Id INT, Name VARCHAR(255), ParentId INT, ParentName VARCHAR(255)) 
4

あなたはしかし@table_variables使用することができます。これらの子/親テーブルをまったく使用するのではなく、おそらくrecursive CTEが役に立つかもしれません。

関連する問題