在SQL 2005中将用户定义的函数部署到多个数据库的最佳方法

时间:2009-09-23 05:05:31

标签: sql-server database

我管理的服务器有大约400多个具有相同数据库架构的数据库,我希望为他们部署自定义clr / .net用户定义函数,是否有任何 easy 方法可以做这个,还是必须单独对每个数据库进行?

最诚挚的问候, 韦恩

3 个答案:

答案 0 :(得分:2)

我认为如果你在master中创建它(在MSSQL中),它可以从该实例中的任何其他db引用。当然,无论如何似乎都适用于Stored Procs。

我应该补充一点,这只适用于数据库全部位于同一服务器实例上的情况......

如果所有400个驻留在多个服务器上,您可以编写一个小应用程序将udf部署到每个SQL服务器实例的主服务器。

答案 1 :(得分:0)

我只是创建一个动态脚本来在每个数据库上创建它。但之后我会把它放在模态数据库中,以便用它创建所有新数据库。

如果函数被修改,你也可以使用相同的脚本推出更改。

答案 2 :(得分:0)

我只想找到一些方法。某种开始;) USE data_base仅适用于内部EXECUTE上下文,因此......

DECLARE @sql NVARCHAR(max)
DECLARE @innersql NVARCHAR(max)

DECLARE  c CURSOR READ_ONLY
FOR
SELECT name FROM sys.databases

DECLARE @name nvarchar(1000)

OPEN c

SET @innersql = 'CREATE FUNCTION Foo(@x varchar(1)) RETURNS varchar(100) AS ' +
                '  BEGIN RETURN(@x + ''''some text'''') END;'
--                                   ^^^^         ^^^^
--         every (') must be converted to QUAD ('''') instead of DOUBLE('') !!!

FETCH NEXT FROM c INTO @name

WHILE @@FETCH_STATUS = 0
  BEGIN
-- create function must be the first statement in a query batch ???
-- ok, will be... in inner EXEC...
    SET @sql = 'USE [' + @name + ']; EXEC (''' + @innersql + ''');'

    --PRINT @sql

    EXEC (@sql)

    FETCH NEXT FROM c INTO @name
  END

CLOSE c

DEALLOCATE c

Ups,我错过了“CLR / .NET”部分阅读问题。遗憾。