除了我的previous post,我想复制依赖对象(如视图或过程)到“静态”数据库。然而,模式名称和其他对象前缀不是生产和静态数据库之间的同...sql2008 - 比多个替换语句更好吗?
[我上设立一个审计数据库中读取Aaron Bertrand's articles,但是这是一个有点多了我们在这个时候的需求。]
使用一些动态SQL中提取对象定义成一个变量之后,我运行多个每次更改,这样的意见/程序仍在运行replace
语句,从静态数据库中提取数据。
replace
声明的原因是视图/过程是使用不同的命名约定创建的。有时我发现<dbname>.dbo.<objectname>
,其他时候是<dbname>..<objectname>
甚至只有dbo.<objectname>
!
而不是使用多个replace
声明如下(我觉得这可能会变得相当大!),有没有更好的方法?桌面驱动方法(使用CURSOR
)会更明智/最明智吗?
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.'[email protected]+ '''));'
set @parmdef = N'@def nvarchar(max) OUTPUT' ;
exec sp_executesql @sql, @parmdef, @[email protected] OUTPUT;
--Carry out object definition replacements
set @ObjDef= replace(@ObjDef, 'CREATE VIEW [dbo].[', 'ALTER VIEW ['[email protected]+'].[');
set @ObjDef= replace(@ObjDef, 'Prod1.dbo.', @dbname+'.'); --replace Prod1 with @dbname
set @ObjDef= replace(@ObjDef, ' dbo.', ' '[email protected]+'.'); --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]
预先非常感谢[数据库/对象名称已经在下面的代码为简单起见改性。
感谢您的答复,但我认为你会发现它只是'OBJECT_DEFINITION()'相反。我可以用2种方法返回定义,另一种是查询'sys.sql_modules'。这两种方法都返回'nvarchar(max)'... – MarkusBee 2012-04-20 08:16:02