【问题标题】:How to organize or avoid temporary User Defined Table Type when passing Table-Valued Parameters传递表值参数时如何组织或避免临时用户定义表类型
【发布时间】:2012-11-08 18:06:06
【问题描述】:

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

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

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

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

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

我无法使用 OPENROWSET 直接从 SQL 加入此文件,因为我有 64 位 SQL Server,它无法正常工作,给我一个奇怪的错误。

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

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

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

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

还有其他建议吗?

【问题讨论】:

  • “我可以将数据作为 XML 传递,但如果数据大小足够大且数据大小限制为 2Gb,则效率似乎较低。” -- 让 Excel 文件生成 2GB 的 XML 本身可能是个问题 ;-)

标签: sql-server sql-server-2008 stored-procedures parameters table-valued-parameters


【解决方案1】:

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

这是您所希望的最佳答案,无需提供有关您的场景的其他详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2018-08-08
    • 2014-10-09
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多