在表值函数中使用临时表

发布于 2024-12-13 09:59:34 字数 1208 浏览 0 评论 0原文

我试图在表值函数中使用临时表,但似乎不能。有没有其他方法可以在表值函数中使用临时表?

当前代码:

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

I'm trying to use a temp table in a table-valued function, but it seems I can not. Is there any other way I can use a temp table in a table-valued function?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乖乖兔^ω^ 2024-12-20 09:59:34

您可以改用表变量

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))

You can use a table variable instead.

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))

不,

您可以使用@table_variables。尽管快速浏览一下,递归 CTE 可能更适合您根本不使用这些子/父表。

No.

You can use @table_variables though. Although from a quick glance maybe a recursive CTE might work for you rather than using these child/parent tables at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文