powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как перекомпилить все представления
14 сообщений из 14, страница 1 из 1
Как перекомпилить все представления
    #32076046
Dm_Lug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При изменении структуры таблиц, все представления использующие эти таблицы не всегда правильно отображают данные(путаются колонки)
Как с этим бороться? В доках нашел только как перекомпилить процедуры.
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076053
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне помогает переконектится к базе. Можно даже отдельную кнопочку сделать. И насколько я заметил этот эффект в основном у объектов где используется * для выборки всех полей.
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076059
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, глянь в BOL-е в сторону SET NOEXEC { ON | OFF }
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076069
Dm_Lug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NOEXEC не то, не помогает.
Чаще помогает вариант, когда переконнектишься, но в моей ситуации необходимо это делать на лету. Возможности глушить сервер не всегда есть (народ у нас нервный пошел)
Тут вот вычитал такую фичу, которая вроде бы должна помочь, но не знаю как это сделать
"После переименования представления следует очистить процедурный кеш для перекомпиляции подчиненных представлений"

А вот как это сделать - ????
В доках есть только как его просмотреть, а что либо с ним сделать, т.е. с процедурным кешем.... ничего
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076086
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBCC FREEPROCCACHE
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076097
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @name varchar( 255 )

DECLARE ViewCursor cursor fast_forward read_only 
FOR SELECT Name FROM SysObjects WHERE Type='V' AND Category= 0 

OPEN ViewCursor

FETCH NEXT FROM ViewCursor INTO @name
WHILE @@fetch_status= 0 
BEGIN
	EXEC sp_refreshview @name
	FETCH NEXT FROM ViewCursor INTO @name
END

CLOSE ViewCursor
DEALLOCATE ViewCursor
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076243
Kilroy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, представления живут в базе в виде текста!!! и компилируются
вместе с запросом, который на них ссылается.
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076363
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp_recompile....
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076371
Kilroy уже сказал, что вью не компилится!!!
sp_recompile [ @objname = ] 'object'

Arguments
[@objname =] 'object'

Is the qualified or unqualified name of a stored procedure, trigger, table, or view in the current database. object is nvarchar(776), with no default. If object is the name of a stored procedure or trigger, the stored procedure or trigger will be recompiled the next time it is run. If object is the name of a table or view, all the stored procedures that reference the table or view will be recompiled the next time they are run.
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076386
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компилятся.... и еще как.... в буфере весят...
если натровить sp_recompile - из буфера удаляется .... и следующие использование приведет к рекомпиляции ....
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076398
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Kilroy, MiCe ...

Известно это давно, во всех версиях SQL Server вьюхи надо пересоздавать. И sp_recompile не помогает...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create table T(id int)
go
create view V
as
select * from T
go
create proc P
as
select * from V
go
exec P
go
alter table T
add name varchar( 100 )
go
exec sp_recompile 'T'
exec sp_recompile 'V'
go
exec P
go
drop table T
drop view V
drop proc P
go
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076401
Kilroy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял, причем здесь я?
view - вообще сам по себе НИКОГДА не компилируется. Компилируется запрос,
процедура и т. д., которая на него ссылается.
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076445
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может это вам поможет.... этот пример восстонавливает текст для всех процедур в текущей базе.... пересоздать я думаю это позволит....
единственное не учитываются зависимости ....depends( with no check ??)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
SET NOCOUNT ON
DECLARE @m INT,@c INT,@q VARCHAR( 8000 ),@tname VARCHAR( 50 )
CREATE TABLE #r (i INT,t NTEXT)
SELECT o.[id] i, c.colid as [c],c.[text] t
INTO #t
FROM (SELECT [id] 
      FROM dbo.sysobjects 
      WHERE xtype='P'
      ) o JOIN dbo.syscomments c 
          ON o.[id] = c.[id]
 -- part 1 вставляем текст процек которые помещаются в одном поле
 
INSERT #r
SELECT i,t
FROM #t t
WHERE NOT EXISTS(SELECT * FROM #t WHERE #t.i=t.i AND #t.c> 1 )
DELETE #t FROM #r t WHERE #t.i=t.i
 -- part 2 остальные
 
SELECT @tname='##tmp'+CAST(@@PROCID AS VARCHAR( 30 )),
@c= 1 ,@q='',@m=MAX(t.c) FROM #t t
WHILE @m>=@c
BEGIN
  SELECT @q=@q+',t'+CAST(@c AS VARCHAR( 10 ))+' NTEXT DEFAULT('''')',@c=@c+ 1 
END
EXEC('CREATE TABLE '+@tname+' (i INT'+@q+')')
EXEC('INSERT '+@tname+' (i,t1) SELECT i,t FROM #t WHERE c=1 DELETE #t WHERE c=1')
SELECT @c= 2 ,@q=''
WHILE @m>=@c
BEGIN
  SELECT @q='UPDATE '+@tname+' SET t'+CAST(@c AS VARCHAR( 10 ))+
         '= t FROM #t WHERE '+@tname+'.i=#t.i AND #t.c='+
         CAST(@c AS VARCHAR( 10 ))+' DELETE #t WHERE c='+
         CAST(@c AS VARCHAR( 10 )),  @c=@c+ 1 
  PRINT @q
  EXEC(@q)
END
SELECT @c= 2 ,@q=''
WHILE @m>=@c
BEGIN
  SELECT @q=@q+' +CAST(t'+CAST(@c AS VARCHAR( 10 ))+' AS NVARCHAR(4000))',  @c=@c+ 1 
END
PRINT @q
EXEC('INSERT #r SELECT i,CAST(t1 AS NVARCHAR(4000))'+@q+' FROM '+@tname)
EXEC('DROP TABLE '+@tname)
SELECT * FROM #r 
...
Рейтинг: 0 / 0
Как перекомпилить все представления
    #32076456
igor_u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp_refreshview посмотри. А вообще select * from ... во вьюхах не рекомендуется использовать - глюки потом замучаешься ловить.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как перекомпилить все представления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]