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


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的语法。

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

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

如果使用函数或过程来获取表名和用于将数据插入#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;

希望这适用于您的情况:

SELECT *, GetLatestTable (1456) INTO #table1

最新更新