Wendelius
Как указывалось в комментариях, SQL-это немного сложный язык для динамического количества столбцов. Сказав это, вы можете разделить строку на несколько строк, а затем выбрать отдельные имена.
Один из способов сделать это-создать пользовательскую функцию. Рассмотрим этот пример
CREATE FUNCTION CustomStringSplit(@value nvarchar(max), @delimiter nvarchar(max))
RETURNS @items TABLE (
Ordinal int,
Part nvarchar(max)
) AS
BEGIN
WITH Items (Ordinal, Part, Remainder) AS (
SELECT 1 AS Ordinal,
CASE
WHEN CHARINDEX(@delimiter, @value) > 0 THEN LEFT(@value, CHARINDEX(@delimiter, @value) - 1)
ELSE @value
END AS Part,
CASE
WHEN CHARINDEX(@delimiter, @value) > 0 THEN SUBSTRING(@value, CHARINDEX(@delimiter, @value) + 1, 99999999)
ELSE NULL
END AS Remainder
UNION ALL
SELECT Items.Ordinal + 1 AS Ordinal,
CASE
WHEN CHARINDEX(@delimiter, Remainder) > 0 THEN LEFT(Remainder, CHARINDEX(@delimiter, Remainder) - 1)
ELSE Remainder
END AS Part,
CASE
WHEN CHARINDEX(@delimiter, Remainder) > 0 THEN SUBSTRING(Remainder, CHARINDEX(@delimiter, Remainder) + 1, 99999999)
ELSE NULL
END AS Remainder
FROM Items
WHERE Items.Remainder IS NOT NULL
)
INSERT INTO @items (Ordinal, Part)
SELECT Items.Ordinal, Items.Part FROM Items;
RETURN;
END;
После создания описанной выше функции вы можете попробовать использовать ее с помощью
DECLARE @name varchar(100);
SET @name = 'ahmed ali adham gaber sumer ahmed';
SELECT * FROM CustomStringSplit(@name, ' ');
В результате получается
Ordinal Part
------- -----
1 ahmed
2 ali
3 adham
4 gaber
5 sumer
6 ahmed
Для того чтобы получить данные в виде столбцов вы можете попробовать например
DECLARE @name varchar(100);
SET @name = 'ahmed ali adham gaber sumer ahmed';
SELECT @name,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 1) AS Col1,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 2) AS Col2,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 3) AS Col3,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 4) AS Col4,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 5) AS Col5,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 6) AS Col6,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 7) AS Col7,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 8) AS Col8,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 9) AS Col9,
(SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 10) AS Col10
Результат должен быть таким
(No column name) Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 Col10
--------------------------------------------------------------------
ahmed ali adham gaber sumer ahmed ahmed ali adham gaber sumer ahmed NULL NULL NULL NULL
Если вы используете SQL Server 2016, вы также можете попробовать использовать
STRING_SPLIT (Transact-SQL) - SQL Server | Microsoft Docs[
^] вместо пользовательской функции.
Wendelius
Без проблем. Попробуйте что - нибудь вроде
Выберите Name_Arabic,
(Выбрать часть из CustomStringSplit(Name_Arabic, ''), где порядковый номер = 1) следующим образом: col1,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 2) как Col2,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 3) как Col3,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 4) как Col4,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 5) как Col5,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 6) как Col6,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 7) как Col7,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 8) как Col8,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 9) как Col9,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 10) как Col10
Из табл.