在表值函数中使用临时表

Posted

技术标签:

【中文标题】在表值函数中使用临时表【英文标题】:Use a temp table in a Table-valued Functions 【发布时间】:2011-12-20 07:35:24 【问题描述】:

我正在尝试,但似乎我不能。有没有其他方法可以?

当前代码:

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

【问题讨论】:

【参考方案1】:

没有。

你可以使用@table_variables。尽管乍一看,recursive CTE 可能对您有用,而不是使用这些子/父表。

【讨论】:

【参考方案2】:

您可以改用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))

【讨论】:

以上是关于在表值函数中使用临时表的主要内容,如果未能解决你的问题,请参考以下文章

从表值函数返回表并在临时表中设置该值

sql 表表达式 - 视图,临时表,表变量,派生表,表值函数,公用表表达式(CTE)

子查询 X 临时表 X 动态 sql X 表值函数

sql 表值函数-将一个传入的字符串用2中分隔符拆分成临时表

表变量

mybatis oracle临时表的使用