Хорошо, это жестко запрограммировано и создает таблицу, но:
- Делает ли она то, что вы хотите?Да
- Это эффективно?О нет.
- Это масштабируется?Нет, но вы могли бы легко изменить это так.
- Если вы действительно хотите, чтобы ваша СУБД сделала это?Определенно нет.
Наслаждайтесь:
DECLARE @SQL nvarchar(MAX);
WITH N AS (
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS (
SELECT TOP 400
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1
CROSS JOIN N N2
CROSS JOIN N N3)
SELECT @SQL = N'CREATE TABLE dbo.InsaneTable (' +
STUFF((SELECT N',' + NCHAR(10) +
N' ' + QUOTENAME(CONCAT('Column',I)) + N' int DEFAULT 10'
FROM Tally
FOR XML PATH(N'')),1,32,N'') + ');';
SELECT @SQL; --Your debugging friend. Not PRINT as we are way over 4,000 characters
EXEC sp_executesql @SQL;
GO
DECLARE @SQL nvarchar(MAX);
WITH N AS (
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS (
SELECT TOP 400
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1
CROSS JOIN N N2
CROSS JOIN N N3)
SELECT @SQL = STUFF((SELECT NCHAR(10) + N'INSERT INTO dbo.InsaneTable (' + QUOTENAME(c.[name]) + N') VALUES (6);'
FROM Tally Ty
JOIN sys.columns c ON c.column_id = Ty.I
JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.[name] = 'InsaneTable'
FOR XML PATH(N'')),1,1,N'');
SELECT @SQL; --Your debugging friend. Not PRINT as we are way over 4,000 characters
EXEC sp_executesql @SQL;
GO
SELECT *
FROM dbo.InsaneTable;
GO
DROP TABLE dbo.InsaneTable;