Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有办法用tsql脚本替换代码和更新视图_Sql Server_Tsql - Fatal编程技术网

Sql server 有没有办法用tsql脚本替换代码和更新视图

Sql server 有没有办法用tsql脚本替换代码和更新视图,sql-server,tsql,Sql Server,Tsql,我在一个数据库中有大约20个视图,它们引用了另一个数据库,我们称之为数据库a。我需要一种方法来用脚本更新这些视图,以指向另一个数据库,数据库B。是否有一种方法可以使用单个tsql脚本将视图中数据库a的名称替换为数据库B的名称,并保持视图的完整性?我可以进行替换并将视图输出到查询窗口,但我希望执行生成的ALTER语句,而不必手动运行输出 更新我想做的与此类似:但也有由脚本执行的输出。这可能吗?我创建了下面的SQL来做同样的事情。此脚本将接受2个输入 1.旧数据库名称 2.新数据库名 3.要修改的视

我在一个数据库中有大约20个视图,它们引用了另一个数据库,我们称之为数据库a。我需要一种方法来用脚本更新这些视图,以指向另一个数据库,数据库B。是否有一种方法可以使用单个tsql脚本将视图中数据库a的名称替换为数据库B的名称,并保持视图的完整性?我可以进行替换并将视图输出到查询窗口,但我希望执行生成的ALTER语句,而不必手动运行输出


更新我想做的与此类似:但也有由脚本执行的输出。这可能吗?

我创建了下面的SQL来做同样的事情。此脚本将接受2个输入 1.旧数据库名称 2.新数据库名 3.要修改的视图列表

declare @OldDb  varchar(250),  @newDB  varchar(250)
select @OldDb = '' , ---------->>> provide old db name
@newDB = '' ---------->>> provide new  db name

    create table #ViewList (Id int identity , ViewName varchar(250))
insert into #ViewList 
select TABLE_NAME from INFORMATION_SCHEMA.VIEWS  where TABLE_NAME IN ( ) ---------->>> provide you view list 

create table #ViewDef(  ViewDef nvarchar(max) , ViewName varchar(250) ,Id int   )

declare @minId int , @maxid int , @sql nvarchar(max) ='' , @ViewName varchar(250)

select @minId = min(Id) , @maxid = max(id) from #ViewList

while @minId <= @maxid

begin 

select @ViewName = ViewName from #ViewList where id = @minId

set @sql = '    insert into #ViewDef (ViewDef)
exec sp_helptext '+ @ViewName +' 
update #ViewDef
set ViewName  = '''+ @ViewName +''', 
id = ' + cast(@minId as varchar(10)) +'
where id is null
update #ViewDef 
set ViewDef = replace(ViewDef , '''+ @OldDb+''','''+ @newDB +''')  
where id = ' + cast(@minId as varchar(10)) +'
update #ViewDef 
set ViewDef = replace(ViewDef , ''create'',''alter'')  
where id = ' + cast(@minId as varchar(10)) +'
'
exec sp_executesql  @sql 

SET @sql = ''

select @sql = @sql + ViewDef from #ViewDef  where id =   @minId   

exec sp_executesql  @sql
--print @sql

set @minId = @minId +1 

end 

**请测试脚本并保存旧定义,以避免在上面的脚本中出现任何错误时发生任何损失。此脚本将接受2个输入 1.旧数据库名称 2.新数据库名 3.要修改的视图列表

declare @OldDb  varchar(250),  @newDB  varchar(250)
select @OldDb = '' , ---------->>> provide old db name
@newDB = '' ---------->>> provide new  db name

    create table #ViewList (Id int identity , ViewName varchar(250))
insert into #ViewList 
select TABLE_NAME from INFORMATION_SCHEMA.VIEWS  where TABLE_NAME IN ( ) ---------->>> provide you view list 

create table #ViewDef(  ViewDef nvarchar(max) , ViewName varchar(250) ,Id int   )

declare @minId int , @maxid int , @sql nvarchar(max) ='' , @ViewName varchar(250)

select @minId = min(Id) , @maxid = max(id) from #ViewList

while @minId <= @maxid

begin 

select @ViewName = ViewName from #ViewList where id = @minId

set @sql = '    insert into #ViewDef (ViewDef)
exec sp_helptext '+ @ViewName +' 
update #ViewDef
set ViewName  = '''+ @ViewName +''', 
id = ' + cast(@minId as varchar(10)) +'
where id is null
update #ViewDef 
set ViewDef = replace(ViewDef , '''+ @OldDb+''','''+ @newDB +''')  
where id = ' + cast(@minId as varchar(10)) +'
update #ViewDef 
set ViewDef = replace(ViewDef , ''create'',''alter'')  
where id = ' + cast(@minId as varchar(10)) +'
'
exec sp_executesql  @sql 

SET @sql = ''

select @sql = @sql + ViewDef from #ViewDef  where id =   @minId   

exec sp_executesql  @sql
--print @sql

set @minId = @minId +1 

end 

**请测试脚本并保存旧定义,以避免在上述scrip中出现任何错误时丢失。您只需将查询定义放入变量中,然后使用sp_executeSQL执行即可

但是:在没有更多工作的情况下,我会谨慎地使用引用的脚本。 例如,并非所有视图都具有确切的文本“创建视图”。 如果是手写的,例如一些可能是“创建视图”或“创建视图”。 另外,“DB1”可能会让我写“[DB1]”

因此,要么添加更复杂的逻辑,要么在执行之前通过肉眼验证一切

   Declare @queryDef nvarchar(max)

   SELECT @queryDef = REPLACE (REPLACE (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 'DB1.', 'DB2.') 
   FROM sys.sql_modules sm JOIN sys.objects o 
        ON sm.object_id = o.object_id
    WHERE
        sm.definition LIKE '%DB1.%' AND o.type = 'V'

    print @queryDef
    exec sp_executeSql @querydef

您只需要将查询定义放入一个变量中,然后使用sp_executeSQL执行

但是:在没有更多工作的情况下,我会谨慎地使用引用的脚本。 例如,并非所有视图都具有确切的文本“创建视图”。 如果是手写的,例如一些可能是“创建视图”或“创建视图”。 另外,“DB1”可能会让我写“[DB1]”

因此,要么添加更复杂的逻辑,要么在执行之前通过肉眼验证一切

   Declare @queryDef nvarchar(max)

   SELECT @queryDef = REPLACE (REPLACE (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 'DB1.', 'DB2.') 
   FROM sys.sql_modules sm JOIN sys.objects o 
        ON sm.object_id = o.object_id
    WHERE
        sm.definition LIKE '%DB1.%' AND o.type = 'V'

    print @queryDef
    exec sp_executeSql @querydef

使用SimonB idea,我创建了一个自动循环:

DECLARE @queryDef NVARCHAR(max)

WHILE EXISTS (
                    SELECT 1
                    FROM sys.sql_modules    sm 
                    JOIN    sys.objects  o ON sm.object_id = o.object_id 
                    WHERE   sm.definition LIKE '%TEXT_TO_REPLACE%' 
                    AND o.type = 'V'
            )
BEGIN
    
                                                                    -- TO ALTER THE VIEW AUTOMATICALLY                                          
    SET @queryDef = (   SELECT TOP 1 Replace (Replace (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 
                                            'TEXT_TO_REPLACE', 
                                            'NEW_TEXT') 

                        FROM sys.sql_modules    sm 
                        JOIN    sys.objects  o ON sm.object_id = o.object_id

                        WHERE   sm.definition LIKE '%TEXT_TO_REPLACE%'
                        AND     o.type = 'V')
    
    EXEC sp_executeSql @queryDef

END

使用SimonB idea,我创建了一个自动循环:

DECLARE @queryDef NVARCHAR(max)

WHILE EXISTS (
                    SELECT 1
                    FROM sys.sql_modules    sm 
                    JOIN    sys.objects  o ON sm.object_id = o.object_id 
                    WHERE   sm.definition LIKE '%TEXT_TO_REPLACE%' 
                    AND o.type = 'V'
            )
BEGIN
    
                                                                    -- TO ALTER THE VIEW AUTOMATICALLY                                          
    SET @queryDef = (   SELECT TOP 1 Replace (Replace (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 
                                            'TEXT_TO_REPLACE', 
                                            'NEW_TEXT') 

                        FROM sys.sql_modules    sm 
                        JOIN    sys.objects  o ON sm.object_id = o.object_id

                        WHERE   sm.definition LIKE '%TEXT_TO_REPLACE%'
                        AND     o.type = 'V')
    
    EXEC sp_executeSql @queryDef

END

SSMS:右键单击数据库,生成脚本,选择视图,脚本到新窗口,搜索和替换,执行。感谢Alex K。这是我做了很长时间的方式,但我需要一个更快的解决方案。另外,对于多个数据库,这样做很容易出错,因为我可能会更新错误的数据库,例如在运行replace.SSMS后,使用默认值。SSMS:右键单击数据库,生成脚本,选择视图,为新窗口编写脚本,搜索和替换,执行。谢谢Alex K。这是我做了很长时间的方式,但我需要一个更快的解决方案。另外,对于多个数据库,这样做很容易出错,因为我可能会在默认情况下更新错误的数据库,例如在运行replace之后。谢谢我发现的唯一问题是,它似乎一次只更新一个视图,但我可以将其保存为函数,并对搜索返回的所有视图执行它。我还没有发现替换CREATE的任何问题,但很高兴知道。这非常有效。谢谢我发现的唯一问题是,它似乎一次只更新一个视图,但我可以将其保存为函数,并对搜索返回的所有视图执行它。我还没有发现替换CREATE的任何问题,但很高兴知道。