문제

나는 읽었다 여기 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);
}

나는 이것이 당신이 한 일보다 더 "올바른"인지는 모르겠지만, 더 자연스럽게 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top