Попробуйте это так, для этого не нужно никаких обобщений c SQL (при условии, что вы можете указать максимальное количество столбцов):
Сначала нам нужно определить макет сценарий для имитации вашей проблемы
DECLARE @tbl TABLE(ID INT IDENTITY, YourString VARCHAR(100));
INSERT INTO @tbl VALUES ('AB')
,('ABC')
,('ABCDEFGHI')
,('XYZABC')
,('JKLMNOPQRSTU')
,('ABCDEF');
- Мы можем установить общую длину чанка. Попробуйте это с другими значениями ...
DECLARE @ChunkLength INT=3;
- Запрос
SELECT p.*
FROM
(
SELECT t.ID
,CONCAT('Col',A.Nmbr) AS ColumnName
,SUBSTRING(t.YourString,(A.Nmbr-1)*@ChunkLength + 1,@ChunkLength) AS Chunk
FROM @tbl t
CROSS APPLY
(
SELECT TOP((LEN(t.YourString)+(@ChunkLength-1))/@ChunkLength) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
) A(Nmbr)
) src
PIVOT
(
MAX(Chunk) FOR ColumnName IN(Col1,Col2,Col3,Col4,Col5,Col6 /*add the maximum column count here*/)
) p;
Идея вкратце:
- Используя
APPLY
вызов мы можем создать построчно . Это вернет несколько строк на входную строку. Количество строк определяется вычисленным предложением TOP. - Мы используем по строкам сначала для создания имени столбца , а затем в качестве параметров в
SUBSTRING()
. - Наконец, мы можем использовать
PIVOT
, чтобы возвратить это как горизонтальный список.
Один совет о результирующих наборах generi c:
Это может быть вроде религии , но - по крайней мере, с моей точки зрения - я бы предпочел fix результирующий набор с большим количеством пустых столбцов, а не в общем определенном набор. Потребитель должен знать формат результата заранее ...
Вы можете использовать точно такой же запрос, как динамически созданный оператор SQL. Единственное, что вам нужно изменить, - это фактический список имен столбцов в пункте IN
PIVOT.