我正在尝试通过ODBC连接将Table-Valued Parameter传递给存储过程。
为此,我必须定义一个用户定义的表类型,该类型定义要发送的数据行。我需要的类型有很多字段,它们都需要匹配目标表中的列。
不必创建非常相似的表类型,有什么方法可以将现有表用作我的类型?
答案 0 :(得分:0)
有一种相当简便的方法,实际上,请使用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
。)