SO,
我正试图找到一个(凌乱?)解决方案来解决更棘手的问题。我有一个SQL Server 2014数据库,它部分地存储来自另一个软件包的数据,但也为我存储数据。该软件会为每组数据创建一个包含特定字段的表格 - Name
和Geometry
字段。例如,一个可能包含城市(dtCitiesData
),另一个包含道路(dtRoadsData
),另一个包含州(dtStates
)等。我还有一个表格(dtSpatialDataTables
)存储存储我想要的数据的表的名称。该表只有2个字段:ID
和TableName
。
我想创建一个SELECT语句,查询所有条目的dtSpatialDataTables
,然后查询名称对应于每个TableName
结果的所有表,以及SELECT Name
和{{1来自他们。
在伪代码中,实际上我想这样做:
Geometry
我可以通过针对SELECT TableName FROM dtSpatialDataTables
FOREACH TableName :
SELECT Name, Geometry FROM (TableName)
的第一个查询轻松地执行此操作,然后对每个返回的行dtSpatialDataTables
执行查询循环,但我想知道这是否可以通过SQL直接进行。
实际上,我想要做的是使用此查询创建一个VIEW,这样我就可以直接查询VIEW,而不是在潜在的大量查询中处理时间。
这可能吗?不幸的是,我的Google-ing并没有发现任何有意义的结果。
谢谢大家!
PS:我觉得这很乱,而不是应该这样做的方式。但我没有选择软件如何将数据放入我的数据库。我只需要使用我得到的东西。那么......这是不是"对"方式或错误"方式,我需要一个解决方案。 :)答案 0 :(得分:1)
你可以使用动态sql做这样的事情。
CREATE PROCEDURE dbo.usp_SpatialData_GetByID
(
@ID INT
)
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX),
@Selects NVARCHAR(MAX) = 'SELECT Name, Geometry, ''<<TableName>>'' AS Source FROM <<TableName>>'
SELECT @SQL = COALESCE(@SQL + ' UNION ALL ', '') + REPLACE(@Selects, '<<TableName>>', TableName)
FROM dtSpatialDataTables
WHERE ID = @ID
EXEC(@SQL)
END
GO
我觉得您在某处遗漏了几何表的过滤,因此您可能需要在@Selects
语句中添加过滤器