Если запрос возвращает одну строку, SQL Server сохраняет это значение в переменной. Однако, если есть несколько строк, это не имеет смысла. Переменная содержит одно значение, но в нем можно хранить несколько значений. Это может привести к ошибке, но Microsoft решила, что она просто сохранит последнее значение. Вполне возможно, что он мог сохранить и первое, но это не то, что они решили. В целом, на это поведение нельзя положиться, поскольку оно не является разумным с точки зрения семантики.
На самом деле, я думаю, что это то, где вы попадаете в ловушку. Хотя можно думать, что запрос имеет цикл for для таблиц и строк, на самом деле это не так. Это серия операций над наборами кортежей (строк). Концептуально, результатом является один набор строк, которые «прибывают» одновременно. Там нет порядка выполнения строк (больше, чем есть порядок выполнения только что существующего массива). Таким образом, в этом нет никакого смысла.
Теперь то, что вы хотите достичь , само по себе разумно. Вы хотите, чтобы строка была построена путем конкатенации результатов запроса, который возвращает несколько строк. Представьте, что у вас есть более простой запрос, в котором вы просто хотите суммировать некоторые числа вместо объединения строк. Вы бы просто использовали агрегат SUM()
, потенциально с предложением GROUP BY
. Результат этого может быть сохранен в переменную. Поскольку агрегация сделает так, что в наборе результатов будет только одна строка, вам не нужно беспокоиться о том, какая строка сохраняет значение. Агрегация строк работает аналогично. За исключением ... SQL Server не имел операции STRING_SUM()
до SQL Server 2017. Тем не менее, есть способы сделать это во всех версиях SQL Server. Вы можете использовать трюк XML или написать свою собственную функцию агрегирования (на языке .NET). См. Мне нужно написать запрос типа group_concat в SQL Server , чтобы узнать, как это сделать.
Надеюсь, этого достаточно, чтобы вы пошли!