Sql server 在SSMS中,如何使用在关键字后返回表名的函数

Sql server 在SSMS中,如何使用在关键字后返回表名的函数,sql-server,tsql,variables,user-defined-functions,Sql Server,Tsql,Variables,User Defined Functions,我想将最新创建的表(其名称包含一个特定的整数)存储到一个临时表中 示例表名称类似于:[database].[dbo].[RQ39411ID1367] 我需要从函数中获取它,因为我需要在稍后的查询中将此函数用于其他表名 请帮助我更改SSMS的语法。希望这适用于您的情况: CREATE FUNCTION [dbo].GetLatestTable (@id int) RETURNS nvarchar(max) BEGIN declare @a varchar(150)

我想将最新创建的表(其名称包含一个特定的整数)存储到一个临时表中

示例表名称类似于:[database].[dbo].[RQ39411ID1367]

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


请帮助我更改SSMS的语法。

希望这适用于您的情况:

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

假设无法重新设计数据库,可以执行以下操作:

SELECT *, GetLatestTable (1456) INTO #table1
像这样使用它

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

如果使用函数或过程获取表名和用于将数据插入表1的动态SQL,则需要注意,select*into table中temp table的范围在动态SQL执行的范围内。这意味着您不能在动态SQL之外使用表,即使在同一会话中也是如此。因此,请使用全局临时表,例如表1,而不是本地临时表

假设使用函数dbo.gettablename拉出表名,则给出:

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

语法看起来像T-SQL,而且您使用了SSMS标记这一事实也表明您正在使用SQL Server。唉,在SQL Server中,用户定义的函数无法执行动态SQL。。。此外,似乎您正试图将标量UDF用作表UDF,这显然是行不通的。此外,您想要这样的结果表明您的数据库设计非常糟糕。。。如果你能用你拥有的表名样本和你期望从函数中得到的结果来回答你的问题,也许有人能帮助你。@ZoharPeled我在问题中添加了表名样本。我需要在db中创建的最新表,其名称包含一个特定的整数。我想将它存储在一个临时表中。这不能用函数来完成。它可以用存储过程来完成,如果你真的想这样做的话,但是我建议你先考虑一下是什么让你陷入混乱,然后考虑数据库的重新设计。它是一个重新设计的最好的或动态的SQL……什么是要给出的?创建的函数从数据库中返回一个表名。因此,我想获取具有该表名的所有列,并将其存储到临时表table1中。如何使用该表名执行以下查询SELECT*INTO table1 from。。。。。。。。。。。如果临时表不存在,则需要使用表名方面的帮助-选择[dbo]。GetLatestTable1作为LatestTableName插入诱惑表(如果已存在)-插入诱惑表LatestTableName值[dbo]。GetLatestTable2上述查询将“tablename”复制到诱惑表中,而不是具有该表名的表的数据。这是我的主要问题。那么,您必须为从函数返回的表名构造一个动态select…into语句。这不能在用户定义的函数内完成。在我的情况下,这不起作用。我可以从函数中获取表名,但无法创建临时表。我正在使用SSMS。您能提供一些建议吗?您能分享一下这个错误吗?您在动态sql中使用的是本地临时表还是全局临时表?
DECLARE @SqCom nvarchar(255) = 'select * into ##table1 from ' + dbo.gettablename(1456)
EXEC (@SqCom);
SELECT * FROM ##table1;