Изменение типа данных таблицы и представления

У меня есть большая база данных с большим количеством представлений и таблиц.

теперь во многих таблицах и представлениях тип данных столбца с именем 'Company' равен INT

со временем данные изменились, и теперь мы хотим, чтобы столбец 'Company' содержал символьное значение.

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

Я попытался изменить тип данных с помощью этой ссылки: Как преобразовать все столбцы Sql одного типа данных в другой

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

Заранее спасибо за вашу помощь!


person sumit    schedule 11.06.2014    source источник
comment
Поскольку представление — это просто представление данных в одной или нескольких таблицах, вам не нужно изменять типы данных представлений — это должно быть сделано автоматически.   -  person Leo Chapiro    schedule 11.06.2014
comment
Нет, вы не хотите этого делать.   -  person podiluska    schedule 11.06.2014
comment
Спасибо, :) при изменении таблицы выдает ошибку, что ALTER TABLE ALTER COLUMN Company не удалось, потому что один или несколько объектов обращаются к этому столбцу. , Могу ли я написать какой-нибудь код, чтобы отключить эту зависимость на некоторое время, а затем вернуть ее обратно   -  person sumit    schedule 11.06.2014


Ответы (2)


Если вы не видите правильный тип данных в своих представлениях, вам необходимо их перекомпилировать. SQL Server не очень умен в отношении аннулирования представлений при изменении зависимых объектов. Например. если у вас есть представление, которое select * (чего вам в любом случае не следует делать) из таблицы, и вы добавляете столбец, представление не будет отражать новый столбец, пока вы его не перекомпилируете. То же самое справедливо и для других изменений зависимых объектов.

Для перекомпиляции представления используйте хранимую процедуру sp_refreshview. На этой странице MSDN описана процедура, а также приведен сценарий в нижней части страница, которая позволяет массово обновлять все ваши просмотры.

person Ralf    schedule 11.06.2014

Прежде всего, вам не нужно ничего изменять в представлении. Любые изменения в соответствующей таблице автоматически отразятся в вашем представлении.

Если нет, это может быть связано с тем, что если представление не создается с помощью schemabinding, sp_refreshview следует запускать при внесении изменений в объекты, лежащие в основе представления, которые влияют на определение представления. В противном случае представление может привести к неожиданным результатам при запросе. ТАК, как предложил @Ralf, я +1 к этому ответу, используйте sp_refreshview для обновления представления.

Для вашего комментария ALTER TABLE ALTER COLUMN Company failed because one or more objects access this column. Это связано с тем, что какое-то ограничение или индекс использует этот столбец, вы должны сначала удалить его, а затем только вы сможете изменить этот столбец.

Вы можете найти связанное ограничение, используя запрос:

select  db_name()    as CONSTRAINT_CATALOG
,t_obj.name as TABLE_NAME
,user_name(c_obj.uid)    as CONSTRAINT_SCHEMA
,c_obj.name  as CONSTRAINT_NAME
,col.name    as COLUMN_NAME
,col.colid   as ORDINAL_POSITION
,com.text    as DEFAULT_CLAUSE

from    sysobjects  c_obj
join syscomments    com on c_obj.id = com.id
join sysobjects t_obj on c_obj.parent_obj = t_obj.id  
join    sysconstraints con on c_obj.id  = con.constid
join syscolumns col on t_obj.id = col.id
and con.colid = col.colid
where
c_obj.uid   = user_id()

Отбросьте любой индекс и/или ограничение для столбца, а затем попробуйте изменить, тогда он должен работать.

Также см. ответы на этот вопрос Сервер 2008)

Надеюсь, поможет.

person Pranav Singh    schedule 12.06.2014