ToString: примеры (SQL)

Функции преобразования типов в строку в MS SQL Server
Раздел: Функции для работы с иерархиями (HierarchyID), HierarchyID
ToString: nvarchar(4000)

Функция преобразования в строку в MS SQL

В MS SQL Server нет встроенной функции с именем ToString. Это название часто используется как общее понятие для операций преобразования различных типов данных в строковый тип VARCHAR или NVARCHAR. Основными инструментами для этого являются функции CAST и CONVERT.

CAST — это стандартная функция SQL для преобразования типа данных одного выражения в другой.

  • Синтаксис: CAST (expression AS data_type [(length)])
  • Параметры:
    • expression — любое допустимое выражение.
    • data_type — целевой тип данных (например, VARCHAR, NVARCHAR, CHAR).
    • length — необязательный параметр, задающий длину для строковых типов.

CONVERT — специфичная для MS SQL функция, которая выполняет аналогичное преобразование, но с дополнительными возможностями форматирования, особенно для типов даты и времени.

  • Синтаксис: CONVERT (data_type [(length)], expression [, style])
  • Параметры:
    • data_type — целевой тип данных.
    • length — необязательная длина для строковых типов.
    • expression — преобразуемое выражение.
    • style — целочисленный параметр, определяющий формат преобразования для типов даты/времени и денежных типов.

Примеры преобразования данных

Использование CAST для базовых преобразований:

SELECT CAST(12345 AS VARCHAR(10)) AS ResultInt,
CAST(123.456 AS VARCHAR(10)) AS ResultFloat,
CAST(GETDATE() AS VARCHAR(20)) AS ResultDate;
ResultInt | ResultFloat | ResultDate
----------|-------------|---------------------
12345 | 123.456 | Jun 30 2023 1:23PM

Использование CONVERT с различными стилями форматирования даты:

SELECT CONVERT(VARCHAR(10), GETDATE(), 104) AS 'Стиль 104 (Германия)',
CONVERT(VARCHAR(10), GETDATE(), 101) AS 'Стиль 101 (США)';
Стиль 104 (Германия) | Стиль 101 (США)
---------------------|-------------------
30.06.2023 | 06/30/2023

Преобразование числового типа с указанием формата:

SELECT CONVERT(VARCHAR(20), 123456.789, 1) AS 'Стиль 1';
Стиль 1
-------------
123456.789

Похожие функции в MS SQL

STR — функция для явного преобразования чисел с плавающей запятой в строку с контролем над форматом.

  • Синтаксис: STR(float_expression [, length [, decimal]])
  • Особенность: Позволяет задать общую длину строки и количество знаков после запятой. Чаще применяется для числовых типов, когда требуется форматированный вывод.
SELECT STR(123.456, 8, 2) AS FormattedNumber;
FormattedNumber
---------------
123.46

FORMAT (доступна с SQL Server 2012) — функция для форматирования значений на основе .NET Framework.

  • Синтаксис: FORMAT(value, format [, culture])
  • Особенность: Обеспечивает максимальную гибкость форматирования, особенно для дат, времени и чисел, но может иметь меньшую производительность по сравнению с CONVERT.
SELECT FORMAT(1234567.89, 'N', 'ru-RU') AS FormattedNumberRU;
FormattedNumberRU
-----------------
1 234 567,89

Аналоги в других СУБД и языках

MySQL: Функции CAST и CONVERT аналогичны SQL Server, но синтаксис CONVERT отличается, а стили форматирования даты не поддерживаются. Также есть функция DATE_FORMAT для форматирования дат.

SELECT CAST(123 AS CHAR(5)), CONVERT('2023-06-30', DATE);
CAST(123 AS CHAR(5)) | CONVERT('2023-06-30', DATE)
---------------------|-------------------------------
123 | 2023-06-30

PostgreSQL: Используется оператор :: или функция CAST. Функция TO_CHAR предоставляет расширенное форматирование.

SELECT 12345::TEXT, TO_CHAR(CURRENT_DATE, 'DD.MM.YYYY');
text  |  to_char
------|------------
12345 | 30.06.2023

Oracle: Основная функция — TO_CHAR для преобразования чисел и дат в строку с шаблоном форматирования.

SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY') FROM DUAL;
TO_CHAR(SYSDATE,
---------------
30-JUN-2023

C# (.NET): Метод .ToString() для объектов и метод String.Format.

int number = 123;
string result = number.ToString("D5"); // "00123"

Типичные ошибки преобразования

1. Недостаточная длина строки: Усечение данных при задании малой длины для VARCHAR.

SELECT CAST('Длинный текст' AS VARCHAR(5));
-----
Длинн

2. Ошибки неявного преобразования: Попытка преобразования несовместимых данных приводит к ошибке.

SELECT CAST('не число' AS INT);
Msg 245, Level 16, State 1...
Conversion failed when converting the varchar value 'не число' to data type int.

3. Использование неверного стиля: Применение стиля форматирования, не соответствующего типу данных.

SELECT CONVERT(VARCHAR(10), 123.45, 104); -- Стиль 104 для дат
123.45  -- Стиль проигнорирован, т.к. тип - число

Изменения в новых версиях MS SQL

Основные функции CAST и CONVERT остаются стабильными. Главное изменение связано с функцией FORMAT, которая была добавлена в SQL Server 2012. Она использует библиотеки .NET CLR для форматирования и поддерживает множество культурных стандартов. С тех пор её возможности не претерпели значительных изменений, но стоит учитывать её потенциальное влияние на производительность при обработке больших наборов данных по сравнению с более легковесными CAST и CONVERT.

Расширенные примеры преобразования

Динамическое форматирование числовых значений в зависимости от величины:

Пример sql
SELECT 
AccountID,
Balance,
CASE
WHEN Balance >= 1000000 THEN CONCAT(CAST(ROUND(Balance / 1000000.0, 1) AS VARCHAR(10)), 'M')
WHEN Balance >= 1000 THEN CONCAT(CAST(ROUND(Balance / 1000.0, 1) AS VARCHAR(10)), 'K')
ELSE CAST(Balance AS VARCHAR(10))
END AS FormattedBalance
FROM (VALUES (1, 5123), (2, 1500000), (3, 450)) AS Accounts(AccountID, Balance);
AccountID | Balance | FormattedBalance
----------|---------|-----------------
1 | 5123 | 5.1K
2 | 1500000 | 1.5M
3 | 450 | 450

Использование CONVERT с двоичными данными:

Пример sql
SELECT CONVERT(VARCHAR(32), 0x4D5353514C, 2) AS BinaryToHexStr;
BinaryToHexStr
---------------
4D5353514C

Создание строки из агрегированных данных с использованием CAST внутри STRING_AGG (SQL Server 2017+):

Пример sql
SELECT 
DepartmentID,
STRING_AGG(CAST(EmployeeID AS VARCHAR(10)) + ': ' + Name, ', ') AS EmployeesList
FROM (VALUES (10, 1, 'Иван'), (10, 2, 'Мария'), (20, 3, 'Петр')) AS Emp(DepartmentID, EmployeeID, Name)
GROUP BY DepartmentID;
DepartmentID | EmployeesList
-------------|-------------------------------
10 | 1: Иван, 2: Мария
20 | 3: Петр

Преобразование типа данных XML в строку:

Пример sql
DECLARE @xml XML = '<root><item id="1">Text</item></root>';
SELECT CAST(@xml AS NVARCHAR(MAX)) AS XmlAsString;
XmlAsString
----------------------------------
<root><item id="1">Text</item></root>

MS SQL ToString function comments

En
ToString Returns a string representation of this hierarchyid value