在 SSMS 中,如何使用在 KEY 字 FROM 后返回表名的函数

Posted

技术标签:

【中文标题】在 SSMS 中,如何使用在 KEY 字 FROM 后返回表名的函数【英文标题】:In SSMS, How to use the function that returns table name after the KEY word FROM 【发布时间】:2020-04-28 06:02:44 【问题描述】:
CREATE FUNCTION [dbo].GetLatestTable (@id int)
    RETURNS nvarchar(max)
    BEGIN
        declare @a varchar(150)
        declare @b varchar(150)
        declare @c varchar(150)
        set @c = (select '%ID' + Cast(@id as nvarchar))
        set @a = (select top 1 name
            from sys.tables
            where name like @c
            order by create_date desc)
        set @b = '[dbo].[' + @a + ']'
    RETURN @b;
END;

SELECT * INTO #table1
from 
    (SELECT * FROM GetLatestTable (1456)) as temp

我想将使用包含特定整数的名称创建的最新表存储到临时表中。

示例表名称如下:[database].[dbo].[RQ39411ID1367]

我需要从函数中获取它,因为稍后我需要在查询中将此函数用于其他表名。

请帮助我更改 SSMS 的语法。

【问题讨论】:

语法看起来像 T-SQL,而且您使用 SSMS 标签的事实也表明您使用的是 SQL Server。唉,在 SQL Server 中,用户定义的函数无法执行动态 SQL……此外,您似乎正在尝试将标量 UDF 用作表 UDF,这显然行不通。 另外,你想要这样的东西表明你的数据库设计非常糟糕......如果你可以edit你的问题与你拥有的表名样本和你期望从函数中得到什么,也许有人可以帮助你。 @ZoharPeled 我在问题中添加了示例表名。我需要在数据库中创建的最新表,其名称包含特定整数。我想将它存储在一个临时表中。 这根本无法使用函数来完成。如果您真的愿意,可以使用存储过程来完成,但我建议您从一开始就考虑是什么让您陷入困境,并考虑重新设计数据库。 它要么是重新设计(最佳),要么是动态 SQL... 【参考方案1】:

假设你不能重新设计数据库,你可以这样做:

CREATE FUNCTION [dbo].GetLatestTable (@id int)
    RETURNS nvarchar(261)
AS
BEGIN

RETURN (
    SELECT TOP 1 quotename(s.name) + '.' + quotename(t.name)
    FROM sys.tables As t
    JOIN sys.schemas As s
        ON t.schema_id = s.schema_id
    WHERE t.name LIKE '%ID' + CAST(@Id as nvarchar(11))
    ORDER BY t.create_date DESC
);

END

并像这样使用它

DECLARE @LastTableName nvarchar(216) = dbo.GetLatestTable(1456);

【讨论】:

如何使用表名来执行以下查询(SELECT * INTO #table1 from .........)在使用表名时需要帮助跨度> 如果你的临时表不存在 - SELECT [dbo].GetLatestTable(1) As LatestTableName INTO #TempTable 如果它已经存在 - INSERT INTO #TempTable(LatestTableName) VALUES ([dbo].GetLatestTable(2)) 上述查询将“表名”复制到 TempTable 中,而不是具有该表名的表的数据。这是我的主要问题。 那么,你必须为你从函数中得到的表名构造一个动态的 select...into 语句。这不能在用户定义的函数中完成【参考方案2】:

如果使用函数或过程来获取table_name和用于向#table1插入数据的动态SQL,那么需要注意select * into #table中的临时表的范围是在动态SQL执行的范围内。这意味着您不能在动态 SQL 之外使用#table,即使在同一个会话中也是如此。所以使用全局临时表,例如##table1 而不是本地临时表。

假设使用函数dbo.gettablename 提取表名给出:

DECLARE @SqCom nvarchar(255) = 'select * into ##table1 from ' + dbo.gettablename(1456)
EXEC (@SqCom);
SELECT * FROM ##table1;

【讨论】:

这在我的情况下不起作用。我能够从函数中获取表名,但无法创建临时表。我正在使用 SSMS。你能推荐点什么吗? 能否分享一下错误,你在动态sql中使用的是本地临时表还是全局临时表?【参考方案3】:

希望这适用于您的情况:

SELECT *, GetLatestTable (1456) INTO #table1

【讨论】:

* 会给什么? 创建的函数从数据库中返回一个表名。所以我想获取具有该表名的所有列并将其存储到临时表中#table1

以上是关于在 SSMS 中,如何使用在 KEY 字 FROM 后返回表名的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SSMS 的块中分隔 SQL 代码?

如何在php和mysql中使用数组和for循环更新表列?

SQLServer之PRIMARY KEY约束

如何在 ssms 中更改用户通过 powershell 连接到数据库引擎的权限?

如何使用 boto3 将文件或数据写入 S3 对象

如何从 Visual Studio 获取 SSMS 中的当前用户 ID?