是否可以创建一个从表中获取列列表的视图?

时间:2012-08-24 08:22:29

标签: sql sql-server-2008

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,并且重新执行查询,则视图现在会显示C1C2C3

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

找到解决方案

使用以下方法:

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

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

答案 2 :(得分:0)

我不认为这是可能的。

如果你真的想参与这样的事情,我会看到两种可能性:

  • 使用动态sql在使用之前创建视图。但是因为视图对于其他用户也是可见的(可能需要其他版本),这可能不是一个解决方案。
  • 使用动态sql创建临时表,然后使用它。临时表仅在当前连接中可见

答案 3 :(得分: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)