我以以下方式在[表格]中存储了数据:
WEEK | Number | Restrict
2018-1 | 1 | 101;102;103
2018-2 | 2 | 101;102;104;105
...
我希望能够选择所选星期的[Number]和[Restrict]结果,然后将[Restrict]分成临时表中的各个结果。
根据到目前为止的发现,根据本文,我可以使用以下内容将[Restrict]列分为几行:Break down a delimited string into a temporary table
USE [database];
DECLARE @Week nvarchar(50);
DECLARE @Restrict VARCHAR(MAX);
SET @Week = '2018-1';
SET @Restrict = (SELECT [Restrict] FROM [dbo].[Table] WHERE [Week] = @Week);
DECLARE @ExclusionData TABLE (
[data] nvarchar(50) NULL
)
INSERT INTO @ExclusionData(data)
SELECT data
FROM dbo.Split(@Restrict, ';') s
SELECT * FROM @ExclusionData
我还如何返回每个“限制”值旁边的“数字”列?
答案 0 :(得分:1)
我认为这将满足您的需求。我很确定有更好的方法,可以考虑一下,但是应该这样做:
USE [database];
DECLARE @Week nvarchar(50);
DECLARE @Restrict VARCHAR(MAX);
DECLARE @Number INT
SET @Week = '2018-1';
-- this is assuming you can only have one row returned
SELECT @Number = Number,
@Restrict = [Restrict]
FROM [dbo].[Table]
WHERE [Week] = @Week
DECLARE @ExclusionData TABLE (
[data] nvarchar(50) NULL
)
INSERT INTO @ExclusionData(data)
SELECT data
FROM dbo.Split(@Restrict, ';') s
SELECT @Number, * FROM @ExclusionData
//已更新了可能的解决方案,但未经过测试如果可以提供表结构和测试数据的数据插入脚本,我可以对此进行测试。您应该可以执行类似的操作
select t.Number, x.Data
FROM [dbo].[Table] t
cross apply (select data FROM dbo.Split(t.[Restrict],';') ) x
WHERE [Week] = @Week
答案 1 :(得分:0)
您可以使用cross apply
:
SELECT t1.[WEEK], t1.[Number], t2.Data as Restrict
FROM table t1 CROSS APPLY
dbo.Split(t1.Restrict, ';') t2
WHERE . . .;
答案 2 :(得分:0)
对于您的项目,我的解决方案可能会过高,但是...
从技术上讲,正确的方法是创建另一个具有返回当前表键的表。表中永远不能包含数组。
您当前的表将丢失Restrict列,并将用作主表。
第二个表将通过外键指向主表。根据您的发言,这看起来与主表(周,数字)相同。它还将具有“限制”列,但只有一个值。
因此主表记录可能是2018-1 | 1,辅助表的记录可能是
2018-1 | 1 | 101,2018-1 | 1 | 102,2018-1 | 1 | 103 ...等。
您可以根据需要在主表上创建一个主键,然后将其用作第二表的外键。
使用此解决方案,您可以计算您拥有的102条记录等,而无需重新解析表。您也可以在该字段上建立索引。您可以更轻松地将子记录添加/删除到父记录中。