现在有一个人员表,主键是工号
工号 | 姓名 |
---|---|
23 | 张三 |
34 | 李四 |
一个设备表格,主键是资产号
资产号 | 设备名称 |
---|---|
1 | 示波器 |
2 | 信号发生器 |
一个物料表格,主键是物料号
物料号 | 物料名称 |
---|---|
1 | 电阻 |
2 | 电容 |
现在要建立一个实验计划表格,主键是计划编号
计划编号 | 责任人工号 | 所需设备资产号 | 所需物料的物料号 |
---|---|---|---|
1 | 23 | 1,2 | 1,2 |
2 | 34 | 1,2 | 1,2 |
责任人、所需设备资产号、所需物料的物料号 都是外键。问题是所需设备可能有不止一个,所需物料也可能有不止一个,且个数不确定,该怎么处理呢?有人知道吗?
改变一下设计思路,用主从表实现(2个表),计划及责任人放在主表,设备及物料id放在明细表里面。
用function函数,把资产号和物料号转义成资产名称和物料名称。
ALTER function [dbo].[GetDictionaryValue](@in nvarchar(255))
returns nvarchar(255)
as
begin
-- 先决条件:D_Code组合必须是用','隔开
-- 函数用途:可以将DictionaryValue表中的 任意D_Code字段 转化 成 D_Name 并使用逗号分割开。
declare @out nvarchar(255) = '';
declare @index int;
declare @name nvarchar(255) = '';
declare @code nvarchar(255);
while(LEN(@in)>0)
begin
select @index = CHARINDEX(',', @in, 0); --找到第一个逗号
if(@index>0)
begin
set @code =Left(@in,@index-1);
end;
else
begin
set @code = @in;
set @index = LEN(@in);
end;
set @in = RIGHT(@in,LEN(@in)-@index); --剩余部分
select @name = D_Name from DictionaryValue where D_Code = @code;
if(LEN(@out)=0)
set @out =@out + @name;
else
set @out =@out +','+ @name;
end;
return @out;
end;
这个属于多对多啊,设置外键存储不了1,2这样的数据
将数据展开存储就行了,
1 23 1 1
2 23 1 2
3 23 2 1
4 24 2 2