Является ли хорошей идеей использовать varchar (max) в качестве аргумента хранимой процедуры? - PullRequest
6 голосов
/ 16 сентября 2010

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

Если я использую varchar (max), чтобы не ограничивать размер передаваемого аргумента, это вызовет проблемы? Я не вижу, чтобы был достигнут предел, но я также не хочу угадывать или устанавливать произвольный предел для строки.

CREATE PROCEDURE myProc
    @IDs varchar(max) 
AS

BEGIN
  ...
END
GO

Ответы [ 5 ]

3 голосов
/ 16 сентября 2010

Там не так много.varchar(max) ведет себя так же, как любой другой varchar длиной менее 8000 символов, пока вы не наберете более 8000 символов.Между varchar(200) и varchar(max) не должно быть никакой разницы, если фактические данные меньше 8000 символов.Если вы ожидаете меньших входных данных, но не можете исключить больших входных данных, varchar(max) - это замечательно.

2 голосов
/ 16 сентября 2010

Я не знаю, может ли это вызвать проблемы, но я предпочитаю передавать какое количество многоэлементных «массивов» в sprocs с использованием XML.Это делает более понятным, что это за данные, и есть хорошие инструменты SQL-XML для «преобразования» XML в псевдотаблицу, к которой вы можете присоединиться.Затем перевод из разделителя канала -> XML может происходить вне БД.

1 голос
/ 16 сентября 2010

Если вы используете SQL Server 2008, я бы использовал параметр с табличным значением. Если нет, я всегда предпочитаю использовать наименьший возможный размер, но я не понимаю, почему MAX вызывает какие-либо проблемы в качестве параметра хранимой процедуры. Если вы хотите, чтобы длина параметра была практически неограниченной, выберите MAX.

0 голосов
/ 16 сентября 2010

TSQL не является хорошим языком для работы со строками, и с точки зрения производительности (и кода!) Вам будет лучше разбирать строку вне БД - так что от +1 до ответа n8wrl . По сути, нет ничего плохого в использовании varchar(max) для этого.

Помимо использования XML, как предложил n8wrl, Табличный параметр может быть хорошим вариантом, если вы используете SQL Server 2008.

0 голосов
/ 16 сентября 2010

Я использую varchar (max), когда не знаю предела (вот для чего он там). Всегда полезно устанавливать переменные определенной длины, но если неизвестно, это приемлемо и не вызовет никаких проблем, за исключением того, что ваша база данных становится немного больше, и люди могут дублировать больший объем данных в

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