Обработка больших строк в Sql Server 2008 - PullRequest
1 голос
/ 21 декабря 2010

У нас есть хранимая процедура, которую мы создали, чтобы пользователь мог написать разделенные запятыми теги поиска в администраторе своего программного продукта.Поэтому он может добавить теги, разделенные запятыми, и в случае, если он захочет их отредактировать, мы прочитаем из таблицы все теги, воссоздадим их в виде значений через запятую (CSV) в хранимой процедуре и вернем их в вызывающий код.Что произошло недавно, пользователь пожаловался на то, что не может видеть новые CSV, которые он написал.Я изучил его и обнаружил, что хранимая процедура усекает строку, когда она читает значения из базы данных и создает строку CSV.Строка имеет тип nvarchar, и, поскольку она превышает максимально допустимое количество символов 4000, значения усекаются.Любые идеи о том, как решить эту проблему.

Найдите мой код внизу.

BEGIN
BEGIN 
    Declare @Synonyms Table
    (
        RowID int Identity(1,1),
        SynonymID int,
        [Synonym] nvarchar(4000)
    );

    SET NOCOUNT ON;

    Insert @Synonyms(SynonymID, [Synonym])
    Select distinct SynonymID, [Synonym] From RF_SearchSynonyms with(nolock) Where SearchTermID = @SearchTermID And ActiveInd = 1

    If((Select COUNT(RowID) From @Synonyms) <> 0)
    BEGIN
        Declare @CurrentRow int = (Select MIN(RowID) From @Synonyms),
                @TotalRows int = (Select MAX(RowID) From @Synonyms),
                @Synonyms_CSV nvarchar(4000) = '';


        WHILE @CurrentRow <= @TotalRows
        BEGIN
            Declare @TempSyn nvarchar(500);
            Select @TempSyn = [Synonym] + ',' From @Synonyms Where RowID = @CurrentRow;
            Set @Synonyms_CSV = @Synonyms_CSV + LTRIM(RTRIM(LOWER(@TempSyn)));

            SET @CurrentRow = @CurrentRow + 1
        END
    END
    Else
    BEGIN
        Set @Synonyms_CSV = '';
    END
END

BEGIN
    Declare @SKUs Table
    (
        RowID int Identity(1,1),
        SkuID int,
        SKU nvarchar(15)
    );

    SET NOCOUNT ON;

    Insert @SKUs(SkuID, SKU)
    Select distinct SkuID, SKU From RF_SearchSkus with(nolock) Where SearchTermID = @SearchTermID And ActiveInd = 1

    If((Select COUNT(RowID) From @SKUs) <> 0)
    BEGIN
        Declare @CurrentRow1 int = (Select MIN(RowID) From @SKUs),
                @TotalRows1 int = (Select MAX(RowID) From @SKUs),
                @Skus_CSV nvarchar(4000) = '';


        WHILE @CurrentRow1 <= @TotalRows1
        BEGIN
            Declare @TempSku nvarchar(15);
            Select @TempSku = SKU + ',' From @SKUs Where RowID = @CurrentRow1;
            Set @Skus_CSV = @Skus_CSV + LTRIM(RTRIM(@TempSku));

            SET @CurrentRow1 = @CurrentRow1 + 1
        END
    END
    Else
    BEGIN
        Set @Skus_CSV = '';
    END
END

BEGIN
    Declare @Combined varchar(8000),
            @syn_len int = 0,
            @sku_len int = 0;

    Select @syn_len = LEN(@Synonyms_CSV);
    Select @sku_len = LEN(@Skus_CSV);
    Select @Combined = @Synonyms_CSV + '-_-' + @Skus_CSV;

    Select @Synonyms_CSV + '-_-' + @Skus_CSV;
END

END

Я не могу использовать текст и текст, поскольку они не воспроизводятсяхорошо с операциями объединения.

Спасибо.

1 Ответ

3 голосов
/ 21 декабря 2010

Как вы объявляете строковый параметр?

nvarchar(max)

поддерживает до 2 ^ 32-1 (2 ГБ)

Смотрите эту ссылку.

...