Переменная таблицы в функции SQL Server из входных столбцов - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел бы создать функцию, которая возвращает столбец на основе ввода из трех других столбцов.Поскольку временные таблицы не разрешены внутри функций, возможно ли создать переменную таблицы из трех входных столбцов?

CREATE FUNCTION dbo.convert_value(
    @CustomerID VARCHAR(MAX),
    @CustomerValue VARCHAR(MAX),
    @CustomerDescription VARCHAR(MAX)
)
RETURNS FLOAT
AS BEGIN

DECLARE @CustomerTable TABLE (
    UniquePatientUID VARCHAR(MAX),
    ResultValue VARCHAR(MAX),
    PracticeDescription VARCHAR(MAX)
);

-- How can I insert @UniquePatientUID, @ResultValue and @PracticeDescription into @CustomerTable

END

В контексте этого вопроса у меня есть сценарий SQL, который использует временные таблицы и многие UPDATE и ALTER TABLE операторов, которые мне нужно преобразовать в функцию.Этот сценарий начинается с трех упомянутых столбцов и добавляет четвертый столбец Converted_Value, который рассчитывается с использованием нескольких сотен строк кода и манипулирует временными таблицами.Есть ли здесь надежда?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Переменная таблицы - это таблица, поэтому вы можете просто использовать INSERT INTO ... VALUES....

 INSERT INTO @CustomerTable (UniquePatientUID,ResultValue,PracticeDescription ) 
 VALUES
 (@UniquePatientUID, @ResultValue , @PracticeDescription)
0 голосов
/ 26 сентября 2018

Если вам не нужна табличная переменная по какой-то конкретной причине, почему бы просто не работать с переменными в качестве производного табличного выражения?то есть

;with inputs (UniquePatientUID, ResultValue, PracticeDescription) as
(
    select @UniquePatientUID, @ResultValue, @PracticeDescription
)
select *
from inputs

Переменные таблицы выходят из области видимости после вызова функции, и вы не можете передавать типы таблиц в функции или из функций.Таким образом, на самом деле все переменные таблицы, которые здесь используются, служат средством хранения мест, что более привычно для разработчиков SQL.Но они не бесплатны, и это единственная причина, по которой мне интересно, какой у вас сценарий использования.

Если вам не нужно возвращать их в виде набора или чего-то подобного, вы можете просто взаимодействовать спеременные тоже напрямую.

0 голосов
/ 26 сентября 2018

Вставка табличной переменной действительно ничем не отличается от обычной вставки.Не используйте временные таблицы.Вы также можете изменить таблицу или просто объявить ее изначально с этим четвертым столбцом и разрешить ей быть ПУСТО (NULL).

INSERT INTO @CustomerTable (UniquePatientUID, ResultValue, PracticeDescription)
VALUES(@CustomerID, @CustomerValue, @CustomerDescription);

Не забудьте вернуть FLOAT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...