2012-08-24 77 views
1

的Microsoft SQL Server 2008是具体的是否可以创建一个视图,从列表中选取列的列表?

我想要做的是:

  • 表1:3个栏C1,C2,C3和任意行数
  • 的表2:1列col和高达3行

Table2中的每行包含C1C2C3(无重复)

我要像做

create view v1 on 
(
    select (select col from Table2) from Table1 
) 

所以,如果Table2包含C1C2,创建节目C1C2

如果Table2视图与更新说C3添加,并重新执行查询,该视图现在将显示C1,C2 d C3

回答

1

发现用下面的方法解决

创建一个存储过程,使所需语句create view v1 on (select C1,c2 from t2)通过使用游标遍历每行并形成正确的字符串。

在exec()中使用该字符串来创建视图。

1

您不能创建一个视图。

但是,您可以创建动态SQL(即:在存储过程中),它将返回所需的结果。

declare @s varchar(500) 
select @s = '' 
select @s = ', ' + col from table2 

declare @sql nvarchar(1000) 

select @sql = 'select ' + substring(@s, 2, len(@s)) + ' from table1' 

exec sp_executesql @sql 
0

我不认为这是可能的。

如果你真的想加入对这样的事情我见两个可能性:

  • 使用动态SQL创建视图之前,为了使用它。但是因为该视图对其他用户也是可见的(这可能需要其他版本),所以这可能不是解决方案。
  • 使用动态sql来创建一个临时表,并使用它。临时表才可以看到在当前连接
0

尝试以下查询

DECLARE @coll nvarchar(100) 
DECLARE @query nvarchar(4000) 
set @query = 'select ' 
DECLARE @colcursor CURSOR 
SET @colcursor = CURSOR FOR 
SELECT col 
FROM Table2 
OPEN @colcursor 
FETCH NEXT 
FROM @colcursor INTO @coll 
WHILE @@FETCH_STATUS = 0 
BEGIN 
--PRINT @coll 
set @query = @query + @coll + ',' 
FETCH NEXT 
FROM @colcursor INTO @coll 
END 
CLOSE @colcursor 
DEALLOCATE @colcursor 
set @query = left(@query,(len(@query)-1)) + 'from Table1' 
print @query 
exec(@query) 
相关问题