【发布时间】:2012-05-23 21:03:02
【问题描述】:
我在一个名为 UserFunctions.dll 的程序集 dll 中有几个函数,例如:
public static partial class VariousFunctions
{
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlBoolean RegexMatch(SqlString expression, SqlString pattern)
{
...
}
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlInt32 WorkingDays(SqlDateTime startDateTime, SqlDateTime endDateTime)
{
...
}
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString getVersion()
{
...
}
...
}
我想用一个 c# 函数生成 sql 脚本,以自动创建或更新此 dll 中包含的属性 SqlFunction 的所有函数。
此 sql 脚本应如下所示:
-- Delete all functions from assembly 'UserFunctions'
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'DROP FUNCTION ' + STUFF(
(
SELECT
', ' + QUOTENAME(assembly_method)
FROM
sys.assembly_modules
WHERE
assembly_id IN (SELECT assembly_id FROM sys.assemblies WHERE name = 'UserFunctions')
FOR XML PATH('')
), 1, 1, '')
-- SELECT @sql
IF @sql IS NOT NULL EXEC sp_executesql @sql
-- Create all functions from assembly 'UserFunctions'
CREATE FUNCTION RegexMatch(@expression NVARCHAR(MAX), @pattern NVARCHAR(MAX)) RETURNS BIT
AS EXTERNAL NAME UserFunctions.VariousFunctions.RegexMatch;
GO
CREATE FUNCTION WorkingDays(@startDateTime DATETIME, @endDateTime DATETIME) RETURNS INTEGER
AS EXTERNAL NAME UserFunctions.VariousFunctions.WorkingDays;
GO
CREATE FUNCTION getVersion() RETURNS VARCHAR(MAX)
AS EXTERNAL NAME UserFunctions.VariousFunctions.getVersion;
GO
第一部分非常简单,但对于第二部分,这可能使用 Type、MethodInfo 和 ParameterInfo 类的反射方法来实现。 有人已经这样做了吗?
【问题讨论】:
标签: c# sql-server sql-server-2008 tsql sql-server-2005