我有一个包含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
答案 0 :(得分:1)
我认为你想要一种方法来拥有一个表驱动器,哪些视图是查询的一部分。换句话说,如果您的表具有以下行:
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
这个解决方案既不优雅也不高效,但如果我能正确理解你的问题,应该可以解决问题。
祝你好运!答案 1 :(得分:0)
这里有很多重要的警告。
首先,使用动态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来创建连接字符串。这里的a link可以很好地解释许多可能的方法,并且可以很好地比较它们。
同样,可能有更好的解决方案,然后走这条路线,特别是如果这不仅仅是一次性的任务。