使用现有表作为表值参数类型?

时间:2019-10-02 21:23:27

标签: sql sql-server tsql table-valued-parameters

我正在尝试通过ODBC连接将Table-Valued Parameter传递给存储过程。

为此,我必须定义一个用户定义的表类型,该类型定义要发送的数据行。我需要的类型有很多字段,它们都需要匹配目标表中的列。

不必创建非常相似的表类型,有什么方法可以将现有表用作我的类型?

1 个答案:

答案 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和collat​​ion之类的东西(使用列is_nullablecollation_name。)