2014-12-05 5 views
1

Использование SQL Server 2008 R2. Мне нужно написать сценарий SQL, который будет искать конкретный текст (например, имя сервера) в существующих представлениях SQL, заменить этот текст на другую строку, а затем обновить представление (ALTER VIEW). Я не могу понять, как писать этот скрипт. Кто-нибудь делает что-то подобное, с которым они могут делиться?Как обновить текст в представлении, а затем обновить представление в скрипте?

Могу ли я извлечь весь текст в переменную, выполнить REPLACE, а затем «переписать» весь вид из этой переменной?

Я могу изменить вид заявление, не зная, как лучше, чтобы получить представление обновляется с этой @viewtext переменной:

declare @viewtext nvarchar(max) 

set @viewtext = (select definition from sys.objects so 
    join sys.sql_modules sm on sm.object_id = so.object_id 
where so.type = 'V' 
    and so.object_id = object_id('dbo.vwHistoryByLocation')) 

set @viewtext = (select replace(@viewtext,'.PROD.','.TEST.')) 
set @viewtext = (select replace(@viewtext,'CREATE VIEW','ALTER VIEW')) 
select @viewtext 

Не уверен, что если есть лучший способ или нет, но вернулся к работая над этим и добилась его работы следующим образом:

declare @rc int = 0 
declare @vwtext nvarchar(max) 
declare @name nvarchar(max) 
declare @descr nvarchar(max) 

declare cur cursor for 
    select so.name, sm.definition from sys.objects so 
     join sys.sql_modules sm on sm.object_id = so.object_id 
    where so.type = 'V' 
     and sm.definition like '%.PROD.%'; 
open cur; 
fetch next from cur into @name, @descr 
while (@@FETCH_STATUS = 0) 
    begin 
    set @vwtext = (select replace(@descr,'.PROD.','.TEST.')) 
    set @vwtext = (select replace(@vwtext,'CREATE VIEW ','ALTER VIEW ')) 
    select @vwtext 

    exec @rc = sys.sp_executesql @vwtext 

    fetch next from cur into @name, @descr; 
    end 
close cur; 
deallocate cur; 
+0

Не уверен, что есть лучший способ или нет, но вернулся к этому и получил его для работы следующим образом: – axSailing

ответ

0

Возможно ли ваше представление? Если да, то вы можете рассмотреть возможность использования:

UPDATE <view_name> SET<column1>=<value1>,<column2>=<value2>,..... 
WHERE <condition>; 

мнение является обновляемым, если выполняются следующие условия:

  1. мнение определяется на основе одной и только одна таблица.

  2. В представлении должен быть PRIMARY KEY таблицы, на основе которой было создано представление.

  3. В представлении не должно быть поля, сделанного из агрегатных функций.

  4. В определении не должно быть предложения DISTINCT в его определении.

  5. В представлении не должно быть предложения GROUP BY или HAVING в его определении.

  6. В его определениях не должно быть SUBQUERIES.

  7. Если представление, которое вы хотите обновить, основано на другом представлении, позднее должно быть обновляемым.

http://www.w3resource.com/sql/update-views/sql-update-views.php#sthash.J5yJBTS8.dpuf

+0

Я не буду знать конкретных атрибутов каждого вида, который может найти содержащий текст поиска. После того, как у меня есть полный текст представления в переменной @viewtext, и я заменю текст CREATE VIEW в заявлении на «ALTER VIEW», я надеялся запустить хранимую процедуру, чтобы подтолкнуть обновленный текст к определению представления. – axSailing

0

Я нашел решение. Вышеприведенное описание, которое я ввело, разрешило мою проблему, и на самом деле мне удалось запустить эту процедуру в хранимую процедуру, чтобы я мог передавать исходные и целевые текстовые значения для любых переменных, которые мне нужно обновить. Спасибо AMA за ваш вклад.