【发布时间】: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