SQL Server 2017 вводит новую агрегатную функцию
STRING_AGG ( expression, separator)
.
Объединяет значения строковых выражений и значений разделителей мест между ними. Сепаратор не добавляется в конце строки.
Конкатенированные элементы можно упорядочить, добавив
WITHIN GROUP (ORDER BY some_expression)
. Для версий 2005-2016 я обычно использую XML метод в принятом ответе.
Однако это может быть неудачным при некоторых обстоятельствах. например если данные, которые будут конкатенированы, содержат
CHAR(29)
, вы видитеFOR XML не может сериализовать данные ... потому что он содержит символ (0x001D), который не разрешен в XML.
Более надежным методом, который может обрабатывать все символы, будет использование агрегата CLR. Однако применение этого подхода к сложным элементам сложнее.
Метод присвоения переменной не гарантируется и его следует избегать в производственном коде.
set "ip="
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "Default"') do if not defined ip set ip=%%b
Взгляните на список из ipconfig
- вероятно, существует более одной строки default
. Поэтому вы получите данные из строки last
, содержащей default
. Вышеупомянутая конструкция возвращает строку first
, содержащую default
.
Вот сценарий WMIC:
@echo off
for /f "tokens=2,3 delims={,}" %%a in ('"WMIC NICConfig where IPEnabled="True" get DefaultIPGateway /value | find "I" "') do echo IPv4 %%~a IPV6 %%~b
pause
for /f "tokens=1-5" %%a in ('route -4 print 0.*'
) do @if "%%e"=="" if "%%a"=="%%b" set "ip=%%c"
Это извлечет шлюз по умолчанию из таблицы маршрутов ipv4.