正如在此处讨论的那样:Passing List<> to SQL Stored Procedure以及在许多其他地方,将表作为参数传递的一种方法是使用SqlParameter。
这个问题是它需要在TypeName属性中指定用户定义的表类型。
我需要从Excel文件加载数据并将其作为参数传递给SQL语句,SQL语句将此数据与其他数据库表连接以获得结果。
为了做到这一点,我需要为Excel文件的每个可能变体创建用户定义表类型。我不想用那些仅用于从每个Excel文件传递数据的类型来污染SQL类型。我如何实现这一目标?
你可能会问我如何加入一些我不知道类型的东西 - 答案是 - 我知道某些领域的名称和类型,但不是全部。此外,如果我想使用select *返回连接数据,它将适用于任何字段列表,而不会在类型内部对所有字段进行硬编码。
我无法使用OPENROWSET直接从SQL加入此文件,因为我有64位SQL Server,它无法解决我的奇怪错误。
SQL Server中有临时表的概念,但没有临时类型的概念,如何模拟临时类型或在传递表时避免使用它?
我可以将数据作为XML传递,但如果数据大小足够大且数据大小限制为2Gb,则效率似乎不高。
组织它的一种方法是创建类型,然后执行语句,然后在之后删除类型或使用TRY..CATCH并在catch中删除类型。
另一个是make特殊模式,在该模式中生成唯一的类型名称,并使用垃圾收集SQL作业不时清理它。它可以与第一种方式结合使用,只是为了清理剩菜。
还有其他建议吗?
答案 0 :(得分:0)
您当然不应该构建2GB表变量或用户定位数据类型并传递它。相反,使用SSIS将文件传递到某种持久表或临时表,然后使用存储过程对其进行操作。即使您设法将2GB数据存储到存储过程中,该事务也会运行很长时间,几乎肯定会阻止其他事务。
在没有提供有关您的方案的其他详细信息的情况下,这是您所希望的答案。