2014-10-15 5 views
0

Я хочу написать хранимую процедуру, чтобы изменить представление, передав имя вида в качестве параметра хранимой процедуры.SQL Server 2008 R2: изменить вид

Пример:

У меня есть мнение, называемое также view1, который выбирает один из 4 таблиц, называемых tb1, tb2, tb3, tb4, которые обновляются с некоторыми изменениями.

Теперь я хочу, чтобы представление обновлялось последними обновленными таблицами.

Попытка:

create proc alterview 
    @viewname varchar(50) 
AS 
    Declare @query nvarchar(max) 
    Declare @TableNames varchar(max) 

    SET @query = 'DECLARE Cursor_Get_Tables CURSOR fast_forward for 
        SELECT Table_Name 
        FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE 
        WHERE View_Name = ''' + @ViewName + ''''      

    EXEC sp_executesql @query 


    OPEN Cursor_Get_Tables 

    FETCH NEXT FROM Cursor_Get_Tables INTO @TableNames 

    WHILE(@@fetch_status = 0) 
    BEGIN 
     /* STUCK here */ 
     SET @query = 'ALTER VIEW ' + @ViewName + ' AS SELECT * FROM ' + @TableNames+ ' 
     /* Not getting to get all tables into single alter view script here */ 

     EXEC(@SQL) 

     FETCH NEXT FROM Cursor_Get_Tables INTO @TableNames 
    END 

    CLOSE Cursor_Get_Tables  
    DEALLOCATE Cursor_Get_Tables 
GO 

Примечание: Я не получаю, как получить все таблицы в один ALTER VIEW сценарий как:

ALTER VIEW View1 AS 
    SELECT * FROM tb1 
    UNION 
    SELECT * FROM tb2 
    UNION 
    SELECT * FROM tb3 
    UNION 
    SELECT * FROM tb4 
    UNION; 

ответ

1

Вам нужно сохранить «ALTER VIEW ViewName AS» вне цикла while. Затем добавьте оператор select с инструкцией alter view внутри цикла. Наконец, вне цикла выполняется запрос.

OPEN Cursor_Get_Tables 

FETCH NEXT FROM Cursor_Get_Tables INTO @TableNames 

SET @query = 'ALTER VIEW ' + @ViewName + ' AS ' 

WHILE(@@FETCH_STATUS = 0) 
    BEGIN 
     SET @query += 'SELECT * FROM ' + @TableNames + ' Union ' 

     FETCH NEXT FROM Cursor_Get_Tables INTO @TableNames 
    END 

CLOSE Cursor_Get_Tables 

DEALLOCATE Cursor_Get_Tables 

SELECT @query = LEFT(@query, Len(@query) - 5) 

EXEC(@SQL) 
+0

Большое спасибо. – Meem

2

Курсор не нужен здесь. Попытайтесь:

CREATE PROC alterview 
    @ViewName sysname 
AS 

DECLARE @SQL nvarchar(MAX); 

SELECT @SQL = 
    'ALTER VIEW ' + @ViewName 
    + ' AS SELECT * FROM ' 
    + STUFF((SELECT ' UNION ALL SELECT * FROM ' + TABLE_NAME 
     FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE 
     WHERE VIEW_NAME = @viewname 
     FOR XML PATH('')), 1, 11, '') + ';'; 
EXECUTE (@SQL); 
GO 
+0

Guzman, Большое Вам спасибо. – Meem

Смежные вопросы