Существует довольно простой способ, по правде говоря, использовать sys.dm_exec_describe_first_result_set
:
USE TestBed;
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'CREATE TYPE dbo.TableType AS table (' +
STUFF((SELECT ',' + NCHAR(13) + NCHAR(10) +
N' ' + QUOTENAME([name]) + N' ' + system_type_name --system_type_name isn't quoted as it's known to be safe
FROM sys.dm_exec_describe_first_result_set(N'SELECT * FROM dbo.PerformanceTest;',NULL, NULL)
ORDER BY column_ordinal
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)') + N');',1,39,'');
PRINT @SQL; --Will need SELECT if over 4,000 characters
Это создает оператор, который создает табличный тип с именем dbo.TableType
, который точноЗеркала стола dbo.PerformanceTest
. Например, в этом случае было сгенерировано следующее:
CREATE TYPE dbo.TableType AS table ([TestID] int,
[TestTarget] varchar(50),
[TestName] varchar(50),
[TimeStart] datetime2(7),
[TimeEnd] datetime2(7),
[TimeTaken_ms] int,
[TotalRows] int,
[RowSets] int,
[AvgRowsPerSet] decimal(12,2));
Если вы хотите исключить пару столбцов, вы можете использовать NOT IN
против name
или удалить их из скопированной PRINT
/ SELECT
, а затем запустите SQL.
Примечание. Не знаю, но вы можете добавить такие вещи, как NULLability и collation (используя столбцы is_nullable
и collation_name
. )