우리의 응용 프로그램은 Oracle 데이터베이스 또는 Microsoft SQL Server 데이터베이스와 동일하게 작동해야합니다. 이를 용이하게하기 위해 쿼리 구문을 균질화하기 위해 소수의 UDF를 작성했습니다. 예를 들어, SQL Server에는 GETDATE ()가 있고 Oracle에는 SYSDATE가 있습니다. 그들은 같은 기능을 수행하지만 다른 단어입니다. 우리는 두 플랫폼에 대해 NOW ()라는 랩퍼 UDF를 작성했으며,이 플랫폼은 관련 플랫폼 특정 구문을 공통 함수 이름으로 랩핑했습니다. 우리는 다른 기능을 가지고 있는데, 그중 일부는 본질적으로 균질화를 위해서만 존재합니다. 불행히도, 이것은 SQL Server 비용이 있습니다. 인라인 스칼라 UDF는 성능을 저하시키고 병렬 처리를 완전히 비활성화합니다. 대안으로, 동일한 목표를 달성하기 위해 CLR 어셈블리 기능을 작성했습니다. 이를 클라이언트에 배포 할 때 교착 상태가 자주 발생했습니다. 이 특정 클라이언트는 복제 및 고 가용성 기술을 사용하고 있으며 여기에 어떤 종류의 상호 작용이 있는지 궁금합니다. CLR 기능을 도입하면 이와 같은 문제가 어떻게 발생하는지 이해하지 못합니다. 참고로, 원래 스칼라 UDF 정의와 C #의 대체 CLR 정의 및 이에 대한 SQL 선언을 포함 시켰습니다. 또한 도움이된다면 제공 할 수있는 교착 상태 XML이 있습니다.
원본 UDF
CREATE FUNCTION [fn].[APAD]
(
@Value VARCHAR(4000)
, @tablename VARCHAR(4000) = NULL
, @columnname VARCHAR(4000) = NULL
)
RETURNS VARCHAR(4000)
WITH SCHEMABINDING
AS
BEGIN
RETURN LTRIM(RTRIM(@Value))
END
GO
CLR 조립 기능
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
CLR 함수에 대한 SQL Server 선언
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO