SO,
我试图为一个更混乱的问题找到一个(混乱的?(解决方案。我有一个SQL Server 2014数据库,它部分存储来自另一个软件包的数据,但也为我存储数据。该软件为每组数据创建一个包含特定字段的表格 - 一个Name
和一个Geometry
字段。例如,一个可能包含城市(dtCitiesData
(,另一个包含道路(dtRoadsData
(,另一个包含州(dtStates
(等。我还有一个表(dtSpatialDataTables
(,它存储存储我想要的数据的表的名称。该表只有 2 个字段:ID
和 TableName
。
该语句查询所有条目dtSpatialDataTables
,然后查询具有与每个TableName
结果对应的名称的所有表,并从中Name
和Geometry
SELECT。
在伪代码中,实际上我想这样做:
SELECT TableName FROM dtSpatialDataTables
FOREACH TableName :
SELECT Name, Geometry FROM (TableName)
我可以通过对dtSpatialDataTables
的第一个查询,然后对返回的每个行TableName
进行查询循环来轻松完成PHP,但我想知道这是否可以通过SQL直接进行。
实际上,我想做的是使用此查询创建一个 VIEW,以便我可以直接查询 VIEW,而不是将处理时间浸泡在可能大量的查询上。
这可能吗?不幸的是,我的谷歌搜索没有出现任何有意义的结果。
谢谢大家!
PS:我认为这很混乱,不应该这样做。但是我别无选择软件如何将数据放入我的数据库中。我只需要使用我得到的东西。所以。。。无论这是"正确"的方式还是"错误"的方式,我都需要一个解决方案。:)
你可以使用动态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
语句中添加过滤器