2013-05-06 2 views
2

В SQL Server создайте представление, используя две таблицы. Одна из таблиц используется *.В SQL Server в таблице добавлен столбец. вызывающая ошибку просмотра

Затем я добавляю столбец в таблицу. Это вызывает ошибку представления.

Чтобы решить эту проблему, необходимо перестроить представление.

Если в этой таблице используется много видов, как определить соответствующие виды и перестроить их?

Есть несколько способов?

Спасибо!

Условия испытаний: SQL Server 2008

Тест SQL:

if exists(select * from sys.objects where name='tblTestA' and type='u') 
DROP TABLE tblTestA 

create table tblTestA(Part varchar(10),Qty int) 
insert into tblTestA values('A',10) 
insert into tblTestA values('B',20) 
go 

if exists(select * from sys.objects where name='tblTestB' and type='u') 
    DROP TABLE tblTestB 
GO 

create table tblTestB(Part varchar(10),Price decimal(9,4)) 
GO 

insert into tblTestB values('A',1.1) 
insert into tblTestB values('B',2.2) 
GO 

if exists(select * from sys.objects where name='v_test' and type='v') 
    DROP VIEW v_test 
go 

create View v_test 
as 
    select a.*,b.Price 
    from tblTestA a, tblTestB b 
    where a.Part=b.Part 
go 

Execute:

select * from v_test 
go 

результат:

Part Qty Price 
A 10 1.1000 
B 20 2.2000 

Добавить столбец

alter table tblTestA add Remark nvarchar(200) not null default('test') 
go 

Execute:

select * from v_test 
go 

Результат:

Part Qty Price 
A 10 test 
B 20 test 
+0

вы могли бы попытаться найти определение представлений для таблицы, которые были изменены, stackoverflow.com/questions/4765323/is-there-a-way-to -retrieve-the-view-definition-from-a-sql-server-using-plain-ado –

+1

[Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/ 2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был отменен с помощью ANSI - ** 92 ** SQL Стандарт (более ** 20 лет ** назад!) –

+0

Спасибо! Хорошие привычки: выберите a. *, B.Цена из tblTestA - внутреннее соединение tblTestB b на a.Part = b.Part? – dream

ответ

2

Вы можете выяснить связанные представления с помощью SQL Server Management Studio.

Вам нужно выбрать таблицу в SSMS, а затем щелкнуть правой кнопкой мыши. Выберите View Dependencies.

На этом рисунке таблица CompanyCategoryXref (синяя стрелка). Зависимый вид в этом случае - CompanyCategory (красная стрелка). Вы также можете видеть, что выбранный объект CompanyCategory имеет тип объекта View (желтый круг).

SSMS Dependency

+0

Согласно вашим советам, я нахожу все Представления. И что потом ? Один за другим вручную запускайте сценарий просмотра? – dream

+0

@dream - у вас может быть сценарий, который обновляет представления, как это предлагается в других ответах. –

3

Если вы создаете вид WITH SCHEMABINDING, вы не столкнетесь с этой проблемой. Для ваших старых просмотров ;-) вы можете использовать sp_refreshview.

Чтобы определить, какие виды полагаются на таблицы, вы можете использовать GUI, но это не очень хорошо масштабируется. Вместо этого я рекомендую вам использовать представления системного управления, например. sys.sql_expression_dependencies. Это позволяет вам перебирать зависимые виды и выпускать exec sp_refreshview для каждого из них.

2

У нас была такая же проблема. У нашего решения должен быть сценарий SQL для обновления всех видов. Мы запускаем этот скрипт после каждой серии сценариев обновления, которые изменяют структуру базы данных - это гарантирует, что все представления обновлены и работают.

Это код T-SQL:

DECLARE @viewname sysname 
DECLARE @counter INT 

SET @counter = 1 

DECLARE viewname_cursor CURSOR FAST_FORWARD FOR 
    SELECT v.[name] 
    FROM sys.views v 
    INNER JOIN sys.sql_modules m ON v.object_id = m.object_id 
    WHERE m.is_schema_bound = 0 -- only refresh non-schemabound views 

OPEN viewname_cursor 

FETCH NEXT FROM viewname_cursor INTO @viewname 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT CAST(@counter AS varchar(3)) + '. Refreshed view ' + @viewname 

    EXEC sp_refreshview @viewname -- refresh the view in question 

    SET @counter = @counter + 1 

    FETCH NEXT FROM viewname_cursor INTO @viewname 
END 

CLOSE viewname_cursor 
DEALLOCATE viewname_cursor 
GO 
Смежные вопросы