有没有办法在一个表示一系列有效值的字段上连接表?例如,一个表的数字或字符串为“51234”,另一个表格的类似“46610..46680 | 48670 | 50000..54280 | 48240”。如果没有办法直接连接这些,有没有办法将该系列转换为每个数字的行,用于表变量或类似的东西?
正在从Dynamics Nav 5.0 SP1生成该系列列,以便将总帐帐户映射到部门。我对该系统的经验很少,而且我们所拥有的很多是第三方签约要做的定制,所以甚至可能是标准的......我甚至没有直接访问数据库对于那个,但据我所知,该系列被存储为varchar(100)。
我经常搜索,但我没有看到类似我需要做的事情。希望这里有人有一些想法..
答案 0 :(得分:1)
首先,这是糟糕的数据库设计,因此对Dynamics Nav或您的第三方承包商感到羞耻,他们应该更清楚。您可以在存储的列上连接表。
可以构造一个适合您的LIKE子句
t1 JOIN t2 ON t1.id LIKE ('%' + t2.id + '%')
所以,如果t1是'46610 | 46680 | 50000 |'和t2是46680这将是匹配。然而,这很快就会变得难以驾驭,并且很难完全达到你想要做的目的。
您最好的办法是规范化数据。这正是你所建议的,并将每个值分解成自己的行。虽然没有内部的“拆分”功能可以实现这一目标。这是一篇关于sql server拆分的SO帖子:link。
老实说,虽然这听起来像是一个可能超出你处理能力的问题(没有直接访问数据库)。我建议雇用某人重写这个来创建标准化数据,或者请求任何人有权修复这个过程。
答案 1 :(得分: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