Я считаю, что они оба работают из-за одного и того же базового (и недокументированного) поведения.Я вполне уверен, что если вы возьмете случай, когда Ицик продемонстрировал, что Подход A терпит неудачу, то Подход B также потерпит неудачу таким же образом и по тем же причинам, несмотря напретензии вашего коллеги.Я не понимаю, как
DECLARE @output VARCHAR(100);
SELECT @output = COALESCE(@output + ', ', '') + COL_VCHAR
отличается от:
DECLARE @output VARCHAR(100) = '';
SELECT @output = @output + ', ' + COL_VCHAR
-- or SELECT @output += ',' + COL_VCHAR
Так что же магически вводит COALESCE
?SQL Server не собирается менять свой план из-за того, что вы делаете с выводом, AFAIK.
Я использую их все время для динамической генерации SQL, и не помню, чтобы когда-либо видел, что они терпят неудачу, иЯ понимаю, что это не твой вопрос.К сожалению, на самом деле не существует способа доказать это, если вы не знаете случая, который не подходит ни для одного из подходов.
Я написал сообщение в блоге о конкатенации строк несколько месяцев назад.Это не совсем относится к вашей проблеме, но Роб Фарли сделал комментарий, который можно считать еще одним недостатком подхода COALESCE
:
https://sqlblog.org/2011/03/08/t-sql-tuesday-16-this-is-not-the-aggregate-youre-looking-for