С общим табличным выражением, задержкой, опережением, парой выражений падежей и для пути XML вы можете вернуть операторы создания таблицы для всего содержимого таблицы в виде одной длинной строки.
Сначала создайте и заполните образец таблицы ( Пожалуйста, сохраните этот шаг в ваших будущих вопросах)
CREATE TABLE Tables
(
Table_N sysname,
Column_N sysname,
DType sysname,
DLength varchar(5)
);
INSERT INTO Tables (Table_N, Column_N, DType, DLength) VALUES
('AUT_C_TABLOG', 'ORIGINAL', 'VARCHAR', '1'),
('AUT_C_TABLOG', 'PROTOCOL', 'VARCHAR', '1'),
('AUT_C_TABLOG', 'TABNAME', 'VARCHAR', '30'),
('ANLA', 'GEGST', 'VARCHAR', '8'),
('ANLA', 'GPLAB', 'DATE', NULL),
('ANLA', 'GRBLT', 'VARCHAR', '5'),
('ANLA', 'GRBND', 'VARCHAR', '5'),
('ANLA', 'KTOGR', 'VARCHAR', '8'),
('ANLA', 'LAND1', 'VARCHAR', '3'),
('ANLA', 'MENGE', 'NUMERIC', '16,3');
Затем используйте cte, чтобы получить имя таблицы отставания и таблицы опережений (чтобы вы знали, когда добавлять таблицу добавления, а когда - нет):
WITH CTE AS
(
SELECT Table_N,
Column_N,
DType,
DLength,
LAG(Table_N) OVER(ORDER BY Table_N) AS PrevTableName,
LEAD(Table_N) OVER(ORDER BY Table_N) AS NextTableName
FROM Tables
)
Теперь, используйте несколько выражений в запросе:
SELECT CASE WHEN PrevTableName IS NULL OR Table_N <> PrevTableName
THEN 'CREATE TABLE '+ Table_N +' ('
ELSE ''
END + Column_N +' '+ DType +
CASE WHEN DLength IS NULL
THEN ''
ELSE '('+ DLength +')'
END +
CASE WHEN NextTableName IS NULL OR Table_N <> NextTableName
THEN '); '
ELSE ', '
END
FROM CTE
ORDER BY Table_N, Column_N -- Don't forget this order by, it's important!
FOR XML PATH('')
Результаты:
CREATE TABLE ANLA (GEGST VARCHAR(8), GPLAB DATE, GRBLT VARCHAR(5), GRBND VARCHAR(5), KTOGR VARCHAR(8), LAND1 VARCHAR(3), MENGE NUMERIC(16,3));
CREATE TABLE AUT_C_TABLOG (ORIGINAL VARCHAR(1), PROTOCOL VARCHAR(1), TABNAME VARCHAR(30));