前置需求
- 伺服器安裝 .NET Framework 1.1。
sn.exe -k c:\snkey.snk 產生強名稱金鑰。
C# 元件原始碼
using System;
using System.Runtime.InteropServices;
using System.Reflection;
[assembly: AssemblyKeyFile("snKey.snk")]
namespace Microshaoft
{
public interface IStrings
{
string StringConvert(string x);
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Strings : IStrings
{
public string StringConvert(string x)
{
return Microsoft.VisualBasic.Strings.StrConv(x,
Microsoft.VisualBasic.VbStrConv.TraditionalChinese,
System.Globalization.CultureInfo.CurrentCulture.LCID);
}
}
}
編譯與註冊
csc.exe /t:library /out:Microshaoft.dll Microshaoft.cs /r:Microsoft.VisualBasic.dll
regasm.exe Microshaoft.dll /tlb:Microshaoft.tlb /codebase
T-SQL 呼叫包裝函數
CREATE FUNCTION UDF_StringConvert(@Input VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @Obj INT, @HR INT, @Src VARCHAR(255), @Desc VARCHAR(255), @Ret VARCHAR(8000);
SET @Ret = '';
EXEC @HR = sp_OACreate 'Microshaoft.Strings', @Obj OUT;
IF @HR = 0
BEGIN
EXEC @HR = sp_OAMethod @Obj, 'StringConvert', @Ret OUT, @Input;
IF @HR <> 0
BEGIN
EXEC sp_OAGetErrorInfo @Obj, @Src OUT, @Desc OUT;
SET @Ret = @Obj + ' ' + @Src + ' ' + @Desc;
END
END
ELSE
BEGIN
EXEC sp_OAGetErrorInfo @Obj, @Src OUT, @Desc OUT;
SET @Ret = @Obj + ' ' + @Src + ' ' + @Desc;
END
EXEC sp_OADestroy @Obj;
RETURN @Ret;
END
GO
-- 測試
SELECT dbo.UDF_StringConvert('阿姐速度極高'); -- 返回 '阿姐速度極高' (繁體)
注意事項
- 需以
sysadmin 身分建立函數(使用 sp_OA* 系列)。
- 生產環境建議加入快取機制,避免頻繁建立/銷毀 COM 物件。
- 簡轉繁參數改為
VbStrConv.SimplifiedChinese 即可雙向轉換。