Ouch! Это довольно сложное требование. Вам нужно будет объединить несколько навыков, чтобы решить эту проблему.
Во-первых, вам нужно создать дополнительные строки. Один из способов добиться этого - через recursion. В приведенном ниже примере я подсчитал, сколько строк требуется для каждого идентификатора клиента. Затем я использовал рекурсию для их создания.
Вам также необходимо разбить каждую строку на 3 300 символьных блоков. В моем примере я использовал 3 3 символьных блока, поэтому его легче читать. Но принцип будет расширяться. Используя SUBSTRING и номер записи, вы можете рассчитать начальную точку для каждого столбца.
Я создал несколько образцов записей в CTE под названием Raw. Это позволяет любому следовать примеру, который находится на Stack Data Exchange (ссылка ниже).
Example
DECLARE @ColumnWidth INT = 3; -- Use to adjust required length of columns A, B and C.
DECLARE @ColumnCount INT = 3; -- Use to adjust number of output columns.
WITH [Raw] AS
(
/* This CTE creates sample records for us to experiment with.
* The note column contains each letter of the alphabet, repeated
* 3 times. The repeatition will help us validate the result set.
*
* Using ceiling, to round up, the field length (@ColumnWidth) and
* the number of fields (@ColumnCount) and the number of charaters (LEN)
* we can calculate how many rows are required.
*/
SELECT
r.ClientId,
r.Note,
CEILING(CAST(LEN(r.Note) AS DECIMAL(18, 8))/(@ColumnWidth * @ColumnCount)) AS RecordsRequired
FROM
(
VALUES
(1, 'aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzz'),
(2, 'aaabbbcccdddeeefffggghhhiiijjjkkklll'),
(3, 'aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnno'),
(4, 'aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnoooppp'),
(5, 'aaabbbcccdddeeefffggghhhiiijjj'),
(6, 'aaabbbcccdd')
) AS r(ClientId, Note)
),
MultiRow AS
(
/* This CTE uses recursion to return multiple rows for
* each orginal row.
* The number returned matches the RecordsRequired value
* from the Raw CTE.
*/
SELECT
1 AS RecordNumber,
RecordsRequired,
ClientId,
Note
FROM
[Raw]
UNION ALL
-- Keep repeating each record until the number of required rows has been returned.
SELECT
RecordNumber + 1 AS RecordNumber,
RecordsRequired,
ClientId,
Note
FROM
MultiRow
WHERE
RecordNumber < RecordsRequired
)
/* Each record returned by the MultiRow CTE is numbered: 1, 2, 3 etc.
* Using this we can extract blocks of text from the orginal Note column.
*/
SELECT
ClientId,
SUBSTRING(Note, ((@ColumnWidth * @ColumnCount) * RecordNumber) - ((@ColumnWidth * 3) -1), @ColumnWidth) AS Column_A,
SUBSTRING(Note, ((@ColumnWidth * @ColumnCount) * RecordNumber) - ((@ColumnWidth * 2) -1), @ColumnWidth) AS Column_B,
SUBSTRING(Note, ((@ColumnWidth * @ColumnCount) * RecordNumber) - ((@ColumnWidth * 1) -1), @ColumnWidth) AS Column_C
FROM
MultiRow
ORDER BY
ClientId, RecordNumber
;
Где ваш код! что вы уже пробовали? – Marusyk
Это не очень понятно. У вас есть точные 3 столбца, а затем столько строк, сколько требуется?Это крайне уродливая вещь, которую вы делаете с вашими данными здесь. –
Вот мой сценарий: \t \t \t КОГДА CN.Note НЕ NULL И CN.Note <> '' \t ТОГДА LEFT (ISNULL (CN.NOTE, КОСМОС (1)), 100) END 'SCATEXT', \t \t \t Случай, когда CN.Note НЕ NULL AND CN.Note <> '' \t \t ТОГДА SUBSTRING (ISNULL (CN.NOTE, пространство (1)), 101, 300) КОНЕЦ 'SCATEXT1', \t \t \t случае, когда КС. Примечание НЕ IS NULL И CN.Note <> '' \t \t ТОГДА SUBSTRING (ISNULL (CN.NOTE, пространство (1)), 301, 500) КОНЕЦ 'SCATEXT2', \t \t \t \t \t \t CASE КОГДА CN.Note NOT NULL AND CN.Note <> '' \t THEN \t SUBSTRING (ISNULL (CN.NOTE, SPACE (1)), 501, 700) END 'SCATEXT3' – Peter