В SSMS, как использовать функцию, которая возвращает имя таблицы после ключевого слова FROM - PullRequest
0 голосов
/ 28 апреля 2020
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.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Предполагая, что вы не можете перепроектировать базу данных, вы можете сделать что-то вроде этого:

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);
0 голосов
/ 28 апреля 2020

Если функция или процедура используется для получения имени_таблицы и динамического элемента c SQL, используемого для вставки данных в #table1, то необходимо отметить, что область действия временной таблицы в select * into #table находится в области действия. динам c SQL исполнение. Это означает, что вы не можете использовать #table за пределами динамического c SQL даже в одном сеансе. Поэтому используйте глобальную временную таблицу, например ##table1 вместо локальной временной таблицы.

Предполагая, что использование функции dbo.gettablename для извлечения имени таблицы дает:

DECLARE @SqCom nvarchar(255) = 'select * into ##table1 from ' + dbo.gettablename(1456)
EXEC (@SqCom);
SELECT * FROM ##table1;
0 голосов
/ 28 апреля 2020

Надеюсь, что это работает для вашего случая:

SELECT *, GetLatestTable (1456) INTO #table1
...