Назначение типизированных переменных TABLE в T-SQL - PullRequest
0 голосов
/ 25 июня 2019

Я определил пользовательский тип таблицы - назовите его TrackRefsTable

объявив две переменные ОБЪЯВИТЬ @ FOO1 AS TrackRefsTable ОБЪЯВИТЬ @ FOO2 AS TrackRefsTable

Есть ли способ установить другой? Очевидное

SET @ FOO2 = @ FOO1

не работает, так как этот метод присваивания работает только для скалярных переменных, и поэтому вы получаете ошибку Необходимо объявить скалярную переменную "@ FOO1"

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

DECLARE @FOO1 AS TrackRefsTable
DECLARE @FOO2 AS TrackRefsTable

-- INSERT INTO @FOO1 here

SET @FOO2 = @FOO1

1 Ответ

0 голосов
/ 27 июня 2019

Таким образом, моя проблема заключалась в том, что SP, в котором я реализовал это, получит относительно неструктурированные данные, а затем попытается применить к ним сортировку и фильтрацию.Чтобы выжать из этого максимальную производительность, нам пришлось делать такие вещи, как иногда заполнение табличной переменной @ FOO1, но затем иногда применять к ней сортировку или фильтрацию с результатами, идущими в @ FOO2, прежде чем соединять ее с реальной таблицей данных, чтобы получить дополнительный столбецданные.Если бы производительность не была такой уж большой проблемой, я бы выбрал более простой вариант - просто создать переменную @FOOFinal, в которую будут помещены все данные, до реализации одного JOIN для получения оставшихся данных.Но INSERT INTO @FOOFinal SELECT * FROM @ FOO1 (например) стоит драгоценных миллисекунд, так что это неприемлемо.

В конечном счете, решение было просто создать отдельный SP, в котором мы выполняем JOIN из такогоТаблица Переменная к другим данным.Поскольку переменная Table была определена как тип табличной переменной, мы могли (благодаря тому факту, что мы больше не поддерживаем ничего более старого, чем SQL Server 2008), использовать Table Type в качестве параметра в SP.Таким образом, решение состоит в том, чтобы просто вызвать этот SP с @ FOO1 или @ FOO2 в качестве передаваемого параметра, и это устраняет необходимость назначать один другому.

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