Использовать существующую таблицу в качестве табличного типа параметра? - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь передать Табличный параметр в хранимую процедуру через соединение ODBC.

Чтобы сделать это, я должен определить пользовательский тип таблицыэто определяет строки данных, которые я посылаю. Тип, который мне нужен, имеет много полей, и все они должны соответствовать столбцам в целевой таблице.

Вместо того, чтобы создавать очень похожий тип таблицы, есть ли способ использовать существующую таблицу в качестве моей? тип

1 Ответ

0 голосов
/ 03 октября 2019

Существует довольно простой способ, по правде говоря, использовать 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. )

...