2012-04-19 54 views
0

除了我的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] 

预先非常感谢[数据库/对象名称已经在下面的代码为简单起见改性。

回答

0

@ben:静态数据库从多个生产数据库中提取,并且希望通过在静态数据库中使用数据库名称作为模式名称来维护原始的“源”。

已关闭。重复与this post

1

您有的另一个问题是使用OBJECT_DEFINITION。这只返回对象名称的前4,000个字符。

使用INFORMATION_SCHEMA.ROUTINES存在同样的问题。

看看这篇文章的讨论的替代品... http://sqlblog.com/blogs/aaron_bertrand/archive/2011/11/08/t-sql-tuesday-24-dude-where-s-the-rest-of-my-procedure.aspx

+2

感谢您的答复,但我认为你会发现它只是'OBJECT_DEFINITION()'相反。我可以用2种方法返回定义,另一种是查询'sys.sql_modules'。这两种方法都返回'nvarchar(max)'... – MarkusBee 2012-04-20 08:16:02

0

“不过,架构名称和其他对象前缀不是生产和静态数据库之间的相同的”

那是你的问题就在这里。让他们一样,你的问题就会消失。使用支持多个实例的SQL Server应该没有障碍。