我有一个表,我想将其从网格表转换为 XYZ 绘图视图,以便我可以导入到应用程序中以创建数据的 3D 绘图。目前该表有 1 列用于序列 (X),一列用于日期 (Y),大约 520 列用于数据点 (Z)。我正在构建一个如下所示的 Union All 视图,但想知道是否有更简单、更有效的方法来做到这一点:
Select seq as x
,t_stamp as y
,D_1 as z
From dbo.Table_3D_data
Union All
Select seq as x
,t_stamp as y
,D_2 as z
From dbo.Table_3D_data
Union All **......**
Select seq as x
,t_stamp as y
,D_520 as z
From dbo.Table_3D_data
Order By seq
这将一直到 D_520 任何支持更轻松或更高效地构建这个简单查询的支持都会很棒
这会起作用,但需要一段时间才能写出查询,而且我仍在学习构建更好的查询。
让我们将其分为两个部分,“更简单”和“更高效”。
采用动态方法将减少代码行数,但代价是降低可理解性并需要更大的权限。
这将以更少的行数和更少的重复执行相同的查询:
declare
@n int = 1,
@max int = 520,
@sql nvarchar(max) = N'',
@query nvarchar(max) = N'',
@union nvarchar(max) = N'' + char(13) + N'Union All' + char(13)
while @n <= @max
begin
set @sql = '
Select seq as x
,t_stamp as y
,D_' + cast(@n as nvarchar(max)) + ' as z
From dbo.Table_3D_data
'
set @query = @query + @union
set @n+=1
end
set @query = trim(substring(@query, 1, len(@query) - len(@union)))
exec(@query)
这是否适合您将取决于具体情况(见下文)。
如果您最终想要一个视图,而不是另一个对象,那么动态 sql 将不适合,因为视图定义中不允许变量声明和对 exec() 的调用。
如果您需要一个可重用的对象,那么将上述内容包装在存储过程中可能是一个好方法,并且可以防止潜在的性能问题,例如在将来的某个时刻将您的视图连接到另一个视图(嵌套视图的执行速度非常缓慢)。
您在评论中提到“我只能使用通过其他程序员或应用程序提供给我的表格和设计”,这表明您可能没有足够的权限来创建过程。这需要与您的管理员核实。