1

有没有办法在一个表示一系列有效值的字段上连接表?例如,一个表有一个带有“51234”的数字或字符串,另一个有类似“46610..46680|48670|50000..54280|48240”的内容。如果没有办法直接加入这些,有没有办法将该系列转换为行,其中每个数字用于表变量或类似的东西?

该系列列是从 Dynamics Nav 5.0 SP1 生成的,用于映射到部门的总帐帐户。我对该系统的经验很少,而且我们有很多定制是第三方签约做的,所以这可能是标准的,也可能不是标准的……我什至没有直接访问数据库的权限为此,但据我所知,该系列被存储为 varchar(100)。

我已经搜索了很多,但我还没有看到我需要做的任何事情。希望这里有人有一些想法..

4

2 回答 2

1

我最终让它做我需要做的事情:

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
于 2012-03-29T16:05:29.640 回答
1

首先,这是糟糕的数据库设计,让 Dynamics Nav 或您的第 3 方承包商感到羞耻,他们应该更了解。您可以在这样存储的列上连接表。

可以构建一个适合您的 LIKE 子句 t1 JOIN t2 ON t1.id LIKE ('%' + t2.id + '%')

所以如果 t1 是 '46610|46680|50000|' 和 t2 是 46680 这将是匹配的。但是,这很快就会变得不守规矩,并且可能很难准确地完成您正在尝试做的事情。

最好的办法是规范化数据。这完全按照您的建议进行,并将每个值分解为它们自己的行。虽然没有内部“拆分”功能可以实现这一点。这是关于 sql server 拆分的 SO 帖子:链接

老实说,尽管这听起来可能超出您的处理能力(无法直接访问数据库)。我建议首先雇用某人重新编写它以创建标准化数据,或者要求任何有权修复此过程的人。

于 2012-03-28T16:23:40.200 回答