sql2008-优于多个替换语句?
除此之外,我还想将依赖对象(如视图或过程)复制到“静态”数据库中。但是,模式名称和其他对象前缀在生产数据库和静态数据库之间并不相同 [我已经读过关于建立审计数据库的内容,但这对于我们目前的需要来说有点过分。] 在使用一些动态sql将对象定义提取到变量中之后,我正在为每个更改运行多个sql2008-优于多个替换语句?,sql,sql-server-2008,tsql,replace,Sql,Sql Server 2008,Tsql,Replace,除此之外,我还想将依赖对象(如视图或过程)复制到“静态”数据库中。但是,模式名称和其他对象前缀在生产数据库和静态数据库之间并不相同 [我已经读过关于建立审计数据库的内容,但这对于我们目前的需要来说有点过分。] 在使用一些动态sql将对象定义提取到变量中之后,我正在为每个更改运行多个replace语句,以便视图/过程仍然运行,从静态数据库中提取数据 使用replace语句的原因是视图/过程是使用不同的命名约定创建的。有时我发现.dbo.,有时是。,甚至只是dbo. 有没有更好的方法来代替下面使用多
replace
语句,以便视图/过程仍然运行,从静态数据库中提取数据
使用replace
语句的原因是视图/过程是使用不同的命名约定创建的。有时我发现.dbo.
,有时是。
,甚至只是dbo.
有没有更好的方法来代替下面使用多个replace
语句(我觉得这可能会变得很大!)?表驱动方法(使用光标)是否更明智
[为了简单起见,在下面的代码中修改了数据库/对象名称]
declare @sql nvarchar(500), @parmdef nvarchar(500),
@dbname varchar(20), @objname varchar(255), @ObjDef varchar(max);
set @dbname = 'ProdC';
--declare cursor; get object name using cursor on dbo.ObjectsToUpdate
--[code removed for simplicity]
set @sql = N'USE '+quotename(@dbname) +'; ' ;
set @sql = @sql + N'SELECT @def=OBJECT_DEFINITION(OBJECT_ID(''dbo.'+@objname+ '''));'
set @parmdef = N'@def nvarchar(max) OUTPUT' ;
exec sp_executesql @sql, @parmdef, @def=@ObjDef OUTPUT;
--Carry out object definition replacements
set @ObjDef= replace(@ObjDef, 'CREATE VIEW [dbo].[', 'ALTER VIEW ['+@dbname+'].[');
set @ObjDef= replace(@ObjDef, 'Prod1.dbo.', @dbname+'.'); --replace Prod1 with @dbname
set @ObjDef= replace(@ObjDef, ' dbo.', ' '+@dbname+'.'); --replace all 'dbo.'
set @ObjDef= replace(@ObjDef, 'dbo.LookupTable1', @dbname+'.LookupTable1');
--[code removed for simplicity]
exec(@ObjDef);
--get next object name from cursor
--[remaining code removed for simplicity]
非常感谢。另一个问题是使用对象定义。这仅返回对象名称的前4000个字符
使用信息\u SCHEMA.ROUTINES
也存在同样的问题
查看这篇文章,了解关于替代方案的讨论
“但是,生产数据库和静态数据库之间的架构名称和其他对象前缀不同”
这就是你的问题所在。让它们保持一致,你的问题就会消失。SQL Server支持多个实例,这样做应该没有障碍。@ben:静态数据库从多个生产数据库中提取,并且希望通过使用数据库名称作为静态数据库中的架构名称来维护原始“源”
关闭。重复使用感谢您的回复,但我想您会发现
对象定义()正好相反。我可以使用两种方法返回定义,另一种是查询sys.sql\u模块
。两种方法都返回nvarchar(max)
。。。