在 T-SQL 中分配 TABLE 类型变量
Posted
技术标签:
【中文标题】在 T-SQL 中分配 TABLE 类型变量【英文标题】:Assigning TABLE typed variables in T-SQL 【发布时间】:2019-06-25 12:20:21 【问题描述】:我已经定义了一个用户定义的表格类型 - 称之为 TrackRefsTable
声明了两个变量 将@FOO1 声明为 TrackRefsTable 将@FOO2 声明为 TrackRefsTable
有没有办法将一个设置为另一个?显而易见的
SET @FOO2 = @FOO1
不起作用,因为此分配方法似乎仅适用于标量变量,因此您会收到错误 必须声明标量变量“@FOO1”
我希望能够避免必须执行 INSERT 语句来将数据从一个移动到另一个,因为这可能是一项昂贵的操作。
DECLARE @FOO1 AS TrackRefsTable
DECLARE @FOO2 AS TrackRefsTable
-- INSERT INTO @FOO1 here
SET @FOO2 = @FOO1
【问题讨论】:
表变量实际上并不包含对表的引用,它们是表。你也不能动态地给它们取别名或重命名它们,所以无论你想用这个实现什么,都必须以其他方式完成(例如,使用一个或另一个的标志)。 是的。我认为你是对的,杰伦。我正在考虑填充这些不同的实例,然后选择“正确的”一个来加入其他东西以进行实际检索。我的问题是,如果使用 2 个或更多这些变量,我将不得不编写 2 个或更多有效相同的 JOIN,从而使我的 SP 膨胀。但是我刚刚意识到,我可以很容易地创建一个 second SP,其中一个作为参数,所以这只是一个用一个或另一个调用 SP 的问题,让我的代码变得漂亮和精简. @JeroenMostert 请添加您的评论作为答案。 “你试图做的事情是不可能的”仍然是正确的答案,而且它帮助我想到了正确的解决方案来让我克服这个困难,所以......你值得称赞,先生! 我认为发布实际解决方案对于将来尝试类似事情的人会更有帮助,而您拥有那个。我不在乎信用,所以请随意写一个不错的答案并自我接受。 干杯 - 当我充实它时会做 【参考方案1】:所以我的问题是我实现它的 SP 将检索相对非结构化的数据,然后尝试对其应用排序和过滤。为了从中获得最大性能,我们不得不做一些事情,比如有时填充一个表变量@FOO1,但有时会对其应用排序或过滤,结果进入@FOO2,然后再将其加入实际的数据表以检索更多列数据。如果性能不是那么重要,我会采取更简单的选择来简单地创建一个变量@FOOFinal,然后在实现单个 JOIN 以获取剩余数据之前将所有数据放入其中。但是 INSERT INTO @FOOFinal SELECT * FROM @FOO1 (例如)花费宝贵的毫秒数,所以这是不可接受的。
最终,解决方案是简单地创建一个单独的 SP,我们在其中将此类表变量与其他数据进行 JOIN。因为表变量被定义为表变量类型,我们可以(由于我们不再支持任何早于 SQL Server 2008 的东西)在 SP 中使用表类型作为参数。因此,解决方案是简单地使用@FOO1 或@FOO2 作为传入的参数调用该SP,这样就无需将一个分配给另一个。
【讨论】:
以上是关于在 T-SQL 中分配 TABLE 类型变量的主要内容,如果未能解决你的问题,请参考以下文章