Обновление табличной функции

У меня есть табличная функция (TVF) в SQL Server, которая выглядит так:

CREATE FUNCTION TVF_xyz(@AuditKey INT)
RETURNS TABLE
AS
    RETURN
        SELECT *
        FROM xyz 
        WHERE AUDIT_KEY = @AuditKey
GO

Теперь я добавил новый столбец в таблицу xyz.

Когда я запрашиваю с помощью TVF_xyz, он не показывает мне новый столбец (показывает все остальные столбцы, кроме недавно добавленных).

Запрос:

SELECT TOP 10 * 
FROM TVF_xyz (1543)

Я хотел бы знать, как обновить TVF, чтобы показать новый столбец.

PS: Select * используется в TVF для получения всех столбцов.


person Ash    schedule 31.03.2017    source источник
comment
Привет маста риан, как мне обновить вид? «xyz» — это таблица, и когда я напрямую запрашиваю эту таблицу, я вижу заполненное новое поле.   -  person Ash    schedule 31.03.2017
comment
Возможно, stackoverflow.com/questions/440308/ поможет вам   -  person TriV    schedule 31.03.2017
comment
Ну там 930 полей, писать их явно - кошмар. Кроме того, есть еще несколько таблиц, для которых мне нужно добавить столбец. Мне интересно, почему он не показывает новую колонку? Я думал, TVF выполняет функцию каждый раз, когда она вызывается.   -  person Ash    schedule 31.03.2017


Ответы (2)


Немного поискав, я нашел sp_refreshsqlmodule (Transact-SQL ), его обычное поведение для TVF.

Для обновления TVF необходимо выполнить следующие SP:

EXEC sys.sp_refreshsqlmodule 'TVF_xyz'
person Ash    schedule 31.03.2017
comment
обычно вы бы этого не сделали... но согласно msdn. Таким образом, возвращаемая структура набора строк определяется неявно. - person maSTAShuFu; 31.03.2017
comment
Извините, я не понял вашего утверждения. Согласно странице MS Technet (ссылка в моем ответе), sp_refreshsqlmodule предназначен для: Обновляет метаданные для указанной хранимой процедуры, не связанной со схемой, определяемой пользователем функции, представления, триггера DML, триггера DDL уровня базы данных или DDL уровня сервера. триггер в текущей базе данных. Постоянные метаданные для этих объектов, такие как типы данных параметров, могут устареть из-за изменений в их базовых объектах. - person Ash; 31.03.2017
comment
Я думаю, чтобы избежать этого сценария, MSDN предложила определить структуру таблицы, потому что в качестве стандарта мы не используем SELECT * - person maSTAShuFu; 31.03.2017
comment
Я не уверен, как это связано с моим вопросом. Однако я рад, что смог понять, как работает TVF и как обновлять метаданные. - person Ash; 31.03.2017
comment
Это очень важно, потому что обычно мы не обновляем медданные после того, как что-то изменили. Это если вы хотите упростить процесс. - person maSTAShuFu; 31.03.2017
comment
Ну, в общем, использование явных имен столбцов имеет смысл. Однако в моем случае у меня есть 930 полей, и я знаю, что собираюсь добавить еще одно поле и готов учитывать изменения метаданных в будущем. В любом случае, спасибо за ваши предложения. - person Ash; 31.03.2017

https://msdn.microsoft.com/en-us/library/bb386954(v=vs.110).aspx

Следующая функция SQL явно указывает, что она возвращает ТАБЛИЦУ. Таким образом, возвращаемая структура набора строк определяется неявно.

образец

CREATE FUNCTION ProductsCostingMoreThan(@cost money)  
RETURNS TABLE  
AS  
RETURN  
    SELECT ProductID, UnitPrice  
    FROM Products  
    WHERE UnitPrice > @cost  
person maSTAShuFu    schedule 31.03.2017