2012-08-24 76 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) 
相關問題