在基于表的视图上合并所有视图

| 我有一个带有SQL视图列表的数据库表 我想创建一个新的视图或存储过程,基于该表中的视图将返回那些合并的视图 像这样
SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_30
    UNION ALL
    SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_30n
    UNION ALL
    SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_60n
    UNION ALL
    SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_today
    UNION ALL
    SELECT     ALINE1, BOOKNO, EMAIL, DEPART, DEP7, type
    FROM         dbo.depart_151days
    UNION ALL
    SELECT     ALINE1, BOOKNO, EMAIL, DEPART, DEP7, type
    FROM         dbo.depart_90Days
    
已邀请:
        这里有很多主要警告。 首先,使用动态SQL通常很危险。它可以使您的数据库遭受SQL注入攻击。如果您不了解这些是什么,那么在我建议您使用动态SQL之前,您需要进行很多自学。 其次,这种模式(将表和表中的列存储以生成SQL)是一种非常糟糕的模式。有很多问题。我无法在不了解您的应用程序/问题空间的情况下建议其他解决方案。 也就是说,以下是它在SQL Server 2005中的工作方式的简化版本。这不包括错误处理等。
DECLARE @sql VARCHAR(MAX)  -- NVARCHAR if you use unicode characters in table names

SELECT
    @sql = dbo.Concatenated_Rows(\'SELECT col1, col2 FROM \' + MT.table_name + \' UNION ALL \')
FROM
    dbo.My_Table MT

-- Remove the extra UNION ALL
SELECT @sql = SUBSTRING(@sql, 1, LEN(@sql) - 11)

EXEC(@sql)
必须编写函数Concatenated_Rows。您可以选择使用游标,甚至使用FOR XML来创建串联的字符串。这里的链接可以很好地解释许多可能的方法,并且可以很好地比较它们。 再一次,可能会有更好的解决方案,然后再走这条路,特别是如果这不仅仅是一次性的任务。     
        我认为您正在寻求一种具有表驱动器的方法,其中视图是查询的一部分。换句话说,如果您的表具有以下行:
dbo.View1
dbo.View2
dbo.View3
您的查询将返回这三个视图的并集;正确? 注意事项:我高度质疑要求您执行此操作的基础关系结构。更好的数据模型可能会使其不必要。但是我假设您没有更改模型的能力,因此请尝试以下操作: 假定上面列出的三个视图位于一个名为“ ViewsToReturn”的表的一个名为“ ViewName”的字段中。构建一个查询,该查询首先合并所有视图,然后根据ViewsToReturn中视图的名称对其进行过滤。像这样:
SELECT * FROM
    (SELECT Field1, Field2, \'dbo.View1\' AS ViewName FROM dbo.View1
    UNION
    SELECT Field1, Field2, \'dbo.View2\' AS ViewName FROM dbo.View2
    UNION
    SELECT Field1, Field2, \'dbo.View3\' AS ViewName FROM dbo.View3
    UNION
    SELECT Field1, Field2, \'dbo.View4\' AS ViewName FROM dbo.View4) AllRecords
WHERE AllRecords.TableName IN
    SELECT ViewName FROM ViewsToReturn
这种解决方案既不优雅也不高效,但是如果我正确理解了您的问题,就可以解决问题。 祝好运!     

要回复问题请先登录注册