Соединение с использованием поля серии - PullRequest
1 голос
/ 28 марта 2012

Есть ли способ объединить таблицы в одном поле, представляющем серию допустимых значений? Например, в одной таблице есть число или строка с «51234», а в другой - что-то вроде «46610..46680 | 48670 | 50000..54280 | 48240». Если нет способа напрямую соединить их, есть ли способ преобразовать эту серию в строки с каждым числом в ней для табличной переменной или что-то в этом роде?

Этот столбец серии создается из Dynamics Nav 5.0 с пакетом обновления 1 (SP1) для счетов главной книги, сопоставляемых с отделами. У меня очень мало опыта работы с этой системой, и МНОГИЕ из того, что у нас есть, это настройки, на которые была заключена контракт с третьей стороной, так что это может быть, а может и не быть стандартом ... У меня даже нет прямого доступа к базе данных для этого тоже, но, насколько я могу судить, эта серия хранится как varchar (100).

Я много искал, но я не видел ничего похожего на то, что мне нужно делать. Надеюсь, у кого-то есть идеи ...

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Я закончил тем, что заставил это сделать то, что мне нужно, с этим:

create PROCEDURE [dbo].[spv_parseGLAccounts] (
    @AllowableAccountFilter AS varchar(250),
    @DeptID AS varchar(6),
    @CompCode AS varchar(6)) AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @FirstOrLocation int, @FirstRangeLocation int;
    DECLARE @LeftPart varchar(250), @RightPart varchar(250)
    SET @AllowableAccountFilter = LTRIM(RTRIM(@AllowableAccountFilter))
    SET @FirstOrLocation = CHARINDEX('|',@AllowableAccountFilter)
    SET @FirstRangeLocation = CHARINDEX('.',@AllowableAccountFilter)

    IF @FirstOrLocation <> 0    -- Split on |
        BEGIN
            SET @LeftPart = SUBSTRING(@AllowableAccountFilter, 1, @FirstOrLocation - 1)
            SET @RightPart = SUBSTRING(@AllowableAccountFilter, @FirstOrLocation + 1, LEN(@AllowableAccountFilter) - @FirstOrLocation)
            EXEC spv_parseGLAccounts @LeftPart, @DeptID, @CompCode
            EXEC spv_parseGLAccounts @RightPart, @DeptID, @CompCode
        END
    ELSE IF @FirstRangeLocation <> 0 -- Split on ..
        BEGIN
            INSERT INTO ValidAccountMapping (DeptID, CompCode, BeginAccount, EndAccount)
                VALUES (@DeptID, @CompCode, SUBSTRING(@AllowableAccountFilter, 1, @FirstRangeLocation - 1), 
                    SUBSTRING(@AllowableAccountFIlter, @FirstRangeLocation + 2, LEN(@AllowableAccountFilter) - @FirstRangeLocation - 1))
        END
    ELSE
        BEGIN
            INSERT INTO ValidAccountMapping (DeptID, CompCode, BeginAccount, EndAccount)
                VALUES (@DeptID, @CompCode, @AllowableAccountFilter, @AllowableAccountFilter)
        END 
END
1 голос
/ 28 марта 2012

Во-первых, это плохой дизайн базы данных, поэтому позор Dynamics Nav или вашего стороннего подрядчика, они должны знать лучше.Вы можете объединять таблицы в столбцах, которые хранятся таким образом.

Может быть возможно создать предложение LIKE, которое подходит вам t1 JOIN t2 ON t1.id LIKE ('%' + t2.id + '%')

Так что, если t1 было '46610 | 46680 | 50000|»и t2 было бы 46680, это было бы совпадением.Однако это быстро станет неуправляемым, и может оказаться трудным выполнить именно то, что вы пытаетесь сделать.

Лучше всего нормализовать данные.Который делает именно то, что вы предложили, и разбивает каждое из значений на отдельные строки.Пока нет внутренней функции «split», которая будет выполнять это.Вот SO сообщение о разделении для сервера SQL: ссылка .

Честно говоря, хотя это звучит как проблема, с которой вы не можете справиться (без прямого доступа к БД).Я бы предложил нанять кого-нибудь, чтобы переписать это для создания нормализованных данных, или попросить кого-нибудь, кто имеет доступ, чтобы исправить этот процесс.

...