3

正如这里所讨论的:将List<> 传递给 SQL 存储过程和许多其他地方,将表作为参数传递的一种方法是使用 SqlParameter。

这样做的问题是它需要在 TypeName 属性中指定用户定义的表类型。

我需要从 Excel 文件加载数据并将其作为参数传递给 SQL 语句,该语句会将这些数据与其他数据库表连接起来以获得结果。

为此,我需要为每个可能的 Excel 文件变体创建用户定义的表格类型。我不想用那些仅用于从每个 Excel 文件传递​​数据的类型污染 SQL 类型。我如何做到这一点?

您可能会问我如何加入我不知道类型的东西 - 答案是 - 我知道某些字段的名称和类型,但不是全部。此外,如果我想使用 select * 返回连接的数据,它将适用于任何字段列表,而无需我将所有字段都硬编码在类型中。

我不能使用 OPENROWSET 直接从 SQL 加入这个文件,因为我有 64 位 SQL Server,它不起作用给我一个奇怪的错误。

SQL Server中有临时表的概念,但是没有临时类型的概念,如何模拟临时类型或者在传表时避免使用它?

我可以将数据作为 XML 传递,但如果数据大小足够大且数据大小限制为 2Gb,则效率似乎较低。

组织它的一种方法是创建类型,然后执行语句,然后在之后删除类型或使用 TRY..CATCH 并在 catch 中删除类型。

另一个是制作特殊的模式,在该模式中生成唯一的类型名称,并使用垃圾收集 SQL 作业不时清理它。它可以与第一种方法结合使用,仅用于清理剩菜。

还有其他建议吗?

4

1 回答 1

0

您当然不应该构建一个 2GB 的表变量或用户定义的数据类型并传递它。相反,使用 SSIS 将文件传递到某种持久表或临时表中,然后使用存储过程对其进行操作。即使您设法将 2GB 的数据存储到存储过程中,该事务也会运行很长时间,以至于几乎肯定会阻塞其他事务。

在不提供有关您的方案的其他详细信息的情况下,这是您所希望的最佳答案。

于 2013-05-16T18:32:08.120 回答