Значение таблицы Параметр ReadOnly Обходной путь
У меня есть SProc с табличным параметром, @section
типа dbo.SectionIn
, Этот параметр используется в SProc, и я хотел бы удалить из него некоторые записи, но, конечно, он предназначен только для чтения.
The table-valued parameter "@sections" is READONLY and cannot be modified.
Мой план состоит в том, чтобы скопировать его содержимое в табличную переменную и использовать вместо этого.
DECLARE @sectionDups as dbo.SectionIn
INSERT INTO @sectionDups
SELECT *
FROM @sections
Мой вопрос: повлечет ли это какое-либо снижение производительности в плане Query, и если нет, то в чем причина требования ReadOnly?
2 ответа
Это приведет к снижению производительности из-за копирования таблицы: чем больше строк в таблице параметров, тем больше это снижает производительность, но если это может быть незначительным для общего запуска sp
AFAIK единственная причина только для чтения TVP - потому что это очень свежая функция в SQL Server и чтения-записи еще в стадии разработки, так что - будьте терпеливы
Не следует копировать переменную таблицы TVP в новую переменную таблицы. Если вы хотите исключить строки, выполните одно из следующих действий:
Использовать
WHERE
предложение, чтобы отфильтровать нежелательные строки.или же
Создать локальную временную таблицу (одиночную
#
) и скопируйте данные TVP к этому. Хотя для этого может потребоваться использование предложения WHERE, поэтому это не имеет большой ценности вне:- лучшая статистика для временной таблицы в отличие от табличной переменной (но с использованием уровня оператора
OPTION (RECOMPILE)
решает тот) - возможность добавлять столбцы
- возможность изменять значения уже в TVP
- лучшая статистика для временной таблицы в отличие от табличной переменной (но с использованием уровня оператора