Функция SQL Server для объединения строк
Отображение хорошо отформатированного текста
Эта функция родилась из-за необходимости отображать адрес в виде хорошо отформатированной строки. При работе с данными такого типа в полях данных часто встречаются пробелы, значения NULL и иногда разделенный текст. Стандартное объединение столбцов привело к двойным разделителям с пробелами или запятыми в конце.
Имея это в виду, нам нужен был способ разделения данных, исключения пробелов, обрезки пробелов и удаления завершающих данных. Существуют различные способы использования только стандартного COALESCE, но это не совсем помогло.
Мы использовали нашу испытанную и проверенную функцию TextToRows для разделения и сортировки текста, а затем записали текстовые значения обратно в новую строку. Преимущество этого заключается в том, что данные можно повторно использовать с выбранными вами разделителями как для ввода, так и для вывода.
SQL
ALTER FUNCTION dbo.TextConc(@Text NVARCHAR(MAX),@Delim CHAR(1),@Sep CHAR(2)) RETURNS NVARCHAR(MAX) WITH SCHEMABINDING AS BEGINDECLARE @Str NVARCHAR(MAX)SELECT @Str=COALESCE(@Str+@Sep,'')+REPLACE(WordStr,@Delim,'')FROM dbo.TextToRows(@Delim,@Text)WHERE WordStr<>''RETURN REPLACE(@Str,@Sep+@Sep,@Sep)ENDGO
Данные испытаний
В целях тестирования мы можем создать временную таблицу и сохранить пару адресов. Объедините оператор select с функцией, и вы увидите, как он возвращает четко отформатированный набор данных, который идеально подходит для отображения.
SQL
DECLARE @Address TABLE(AddressName NVARCHAR(100),AddressL1 NVARCHAR(100),AddressL2 NVARCHAR(100),AddressL3 NVARCHAR(100),AddressCity NVARCHAR(100),AddressCounty NVARCHAR(100),AddressCountry NVARCHAR(100),AddressPostCode NVARCHAR(100))INSERT INTO @AddressSELECT 'Mountain View','1600 Amphitheatre Parkway',NULL,NULL,'Mountain View','California','United States','94043'INSERT INTO @AddressSELECT 'London','1-13 St Giles High St',NULL,NULL,'London','London','United Kingdom','WC2H 8LG'SELECT dbo.TextConc(ISNULL(AddressName,'')+','+ISNULL(AddressL1,'')+','+ISNULL(AddressL2,'')+','+ISNULL(AddressL3,'')+','+ISNULL(AddressCity,'')+','+ISNULL(AddressCounty,'')+','+ISNULL(AddressCountry,'')+','+ISNULL(AddressPostCode,''),',',', ')FROM @Address
Results
Сохранять данные в таблице
Поскольку мы создали данные с помощью SCHEMABINDING, мы также можем добавить их в таблицу в качестве вычисляемого столбца.
Обратите внимание, что при их добавлении это может повлиять на производительность запроса, поэтому мы обычно стараемся сохранить данные постоянными, это фактически сохраняет данные в таблице и рассчитывается только для транзакций вставки / обновления.
SQL
CREATE TABLE TestAddress(AddressName NVARCHAR(100),AddressL1 NVARCHAR(100),AddressL2 NVARCHAR(100),AddressL3 NVARCHAR(100),AddressCity NVARCHAR(100),AddressCounty NVARCHAR(100),AddressCountry NVARCHAR(100),AddressPostCode NVARCHAR(100),AddressDisplay as dbo.TextConc(ISNULL(AddressName,'')+','+ISNULL(AddressL1,'')+','+ISNULL(AddressL2,'')+','+ISNULL(AddressL3,'')+','+ISNULL(AddressCity,'')+','+ISNULL(AddressCounty,'')+','+ISNULL(AddressCountry,'')+','+ISNULL(AddressPostCode,''),',',', ') PERSISTED)INSERT INTO TestAddressSELECT 'Mountain View','1600 Amphitheatre Parkway',NULL,NULL,'Mountain View','California','United States','94043'INSERT INTO TestAddressSELECT 'London','1-13 St Giles High St',NULL,NULL,'London','London','United Kingdom','WC2H 8LG'SELECT * FROM TestAddressDROP TABLE TestAddress