【问题标题】:SQL How to SELECT specific fields from tables using a table of table namesSQL如何使用表名表从表中选择特定字段
【发布时间】:2016-02-06 00:33:31
【问题描述】:

所以,

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

我想创建一个 SELECT 语句,它查询 dtSpatialDataTables 的所有条目,然后查询名称对应于每个 TableName 结果的所有表,并从中选择 NameGeometry

在伪代码中,实际上我想这样做:

SELECT TableName FROM dtSpatialDataTables

FOREACH TableName :
    SELECT Name, Geometry FROM (TableName)

我可以通过对dtSpatialDataTables 的第一个查询然后对每个返回的行TableNames 进行循环查询来轻松地做到这一点,但我想知道这是否可以直接通过 SQL 实现。

实际上,我想做的是用这个查询创建一个 VIEW,这样我就可以直接查询 VIEW,而不是在可能的大量查询上花费处理时间。

这可能吗?不幸的是,我的谷歌搜索没有找到任何有意义的结果。

谢谢大家!

PS:我认为这很混乱,而不是应该这样做。但是对于软件如何将数据放入我的数据库中,我别无选择。我只需要使用我得到的东西。所以......无论这是“正确”的方式还是“错误”的方式,我都需要一个解决方案。 :)

【问题讨论】:

  • 我不是 100% 确定您想要什么,但听起来您可以创建动态 SQL 并使用 exec 运行它。这不是您可以在视图中执行的操作,但也许存储过程可以吗?
  • 听起来你需要一个动态 sql 或游标(选择你的毒药),但你需要创建一个过程,因为它们都不能在 VIEW 中工作
  • 还需要指定Name, Geometry是否为DISTINCT
  • 您可以构建动态 SQL 查询。这可能会有所帮助:stackoverflow.com/questions/17955625/…
  • 这样做的想法是 a) 节省处理时间 b) 使用单个 PHP 查询轻松访问数据。视图适用于那些,但存储过程会很快吗?还是只是做 PHP 在循环中会做的事情?

标签: sql-server database


【解决方案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 语句中添加过滤器

【讨论】:

  • 完美!一些轻微的修改,这就像一个魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多