SQL如何使用表名

时间:2016-02-05 16:02:33

标签: sql-server database

SO,

我正试图找到一个(凌乱?)解决方案来解决更棘手的问题。我有一个SQL Server 2014数据库,它部分地存储来自另一个软件包的数据,但也为我存储数据。该软件会为每组数据创建一个包含特定字段的表格 - NameGeometry字段。例如,一个可能包含城市(dtCitiesData),另一个包含道路(dtRoadsData),另一个包含州(dtStates)等。我还有一个表格(dtSpatialDataTables )存储存储我想要的数据的表的名称。该表只有2个字段:IDTableName

我想创建一个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:我觉得这很乱,而不是应该这样做的方式。但我没有选择软件如何将数据放入我的数据库。我只需要使用我得到的东西。那么......这是不是"对"方式或错误"方式,我需要一个解决方案。 :)

1 个答案:

答案 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语句中添加过滤器