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包含C1and C2,则创建的视图显示C1andC2

如果Table2更新了 sayC3添加,并重新执行查询,则视图现在将显示C1C2并且C3

4

4 回答 4

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
于 2012-08-24T08:28:28.283 回答
1

找到了解决方案

使用了以下方法:

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

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

于 2012-08-24T10:45:33.127 回答
0

我不认为这是可能的。

如果你真的想加入反对这样的事情,我看到了两种可能性:

  • 使用动态 sql 在使用它之前创建视图。但是因为该视图也对其他用户可见(可能需要它的其他版本),所以这可能不是一个解决方案。
  • 使用动态 sql 创建一个临时表,并使用它。临时表只会在当前连接中可见
于 2012-08-24T08:29:50.040 回答
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)
于 2012-08-24T09:27:54.290 回答