SQL Server 2008의 사용자 정의 집계 -maxBytesize = -1로 배포하는 방법?
-
05-07-2019 - |
문제
나는 읽었다 여기 SQL Server 2008에서는 8000 문자보다 긴 문자열을 반환 할 수있는 사용자 정의 집계를 구축 할 수 있습니다. 이것이 바로 내가 필요한 것입니다.
아마도,이 방법은 MaxBytesize를 숫자 BTW 1 및 8000 대신 -1로 설정하는 것입니다. 이렇게하면 최대 2GB의 크기가 필요합니다.
어떤 이유로 든,이 설정을 사용하는 경우 Visual Studio 2008에서 곧바로 배포 할 수 없습니다. 따라서 수동으로 배포해야합니다.
그래서 : 나는 프로젝트의 bin 폴더에서 "sqlclasslibrary.dll"파일을 제공하는 프로젝트 -groupconcat (mysql의 Group_Concat Aggregator를 시뮬레이션하기로되어 있음)을 만듭니다. 위의 연결된 페이지의 지침에 따라 SQL Server에서 어셈블리를 빌드합니다. 명령이 성공적으로 실행됩니다. 그러나 내가 실제로 시도 할 때 사용 GroupConcat Aggregator :
select department, dbo.groupconcat(projectNumber) from projectleads group by department
... 찾을 수 없다고 말합니다. MaxBytesize를 8000으로 설정하고 VS2008 내에서 직접 배포하면이 모든 것이 잘 작동하지만> 8000이 필요합니다. 내가 뭘 잘못하고 있는지 아는 사람 있나요?
감사합니다 -Dan
노트: 내가 자주 본 SQL 서버 트릭 중 일부를 사용하는 대신 GroupConcat Aggregator 기능이 있어야합니다.
해결책 2
Vis Studio에서 솔루션을 구축 한 후 .dll을 떨어 뜨렸다 고 가정하면 C : temp로 작성하여 groupconcat.dll이라고 부릅니다.
CREATE ASSEMBLY GroupConcat from 'C:\temp\GroupConcat.dll' with permission_set = safe
GO
CREATE AGGREGATE groupconcat(@input nvarchar(max))
RETURNS nvarchar(max)
EXTERNAL NAME GroupConcat
GO
그렇게합니다.
다른 팁
또는 사용할 수 있습니다 MaxSize
의 자산 SqlFacetAttribute
Varchar 크기를 나타냅니다. 아래 예에서는이 속성을 SqlString
매개 변수 Accumulate
방법과 반환 값에 Terminate
방법. 이로 인해 다음 SQL 서명이 발생합니다.
AGGREGATE [dbo].[Concatenate] (@value nvarchar(max), @order int, @seperator nvarchar(max)) RETURNS nvarchar(max)
[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined,
IsInvariantToOrder = true,
IsInvariantToNulls = true,
IsInvariantToDuplicates = false,
IsNullIfEmpty = false,
MaxByteSize = -1)]
public struct Concatenate : IBinarySerialize
{
public void Init();
public void Accumulate([SqlFacet(MaxSize = -1)] SqlString value,
SqlInt32 order,
[SqlFacet(MaxSize = -1)] SqlString seperator);
public void Merge(Concatenate group);
[return: SqlFacet(MaxSize = -1)]
public SqlString Terminate();
public void Read(BinaryReader r);
public void Write(BinaryWriter w);
}
나는 이것이 당신이 한 일보다 더 "올바른"인지는 모르겠지만, 더 자연스럽게 보입니다.