使用动态值创建一个包含行值的列的表

时间:2015-10-17 14:39:54

标签: tsql

我有一个包含'属性'

的表格
ID    Text
-----------
1     Name
2     Surname
3     D.O.B.
4     City

另一张包含'人物'

的表格
ID    Code
-----------
1     MN0001
2     ST0001
3     ST0002

另一张表' propertiesPeople'关联那2个表。一个人可能有一定数量的属性。

ID    IDPerson    IDProp    Value
----------------------------------
1     1           1         Peter
2     1           2         Johnson
3     2           1         John
4     2           3         01/01/1977
5     1           4         California
6     3           1         Julian
7     3           2         Ross
8     3           4         Osaka

在插入一个人/人之前,我需要验证没有其他具有相同属性的属性(要验证的属性是可变的,它将存储在另一个表" propertiesToValidate')

我想过制作一个动态SQL围绕“属性”进行循环。而这个选择将完成如下:

SELECT p1.Value, p2.Value, p3.Value
FROM properties p1
INNER JOIN properties p2 ON p1.IDPerson=p2.IDPerson
INNER JOIN properties p3 ON p1.IDPerson=p3.IDPerson
WHERE p1.IDProp = 1
AND p2.IDProp = 2
AND p3.IDProp = 4

并将其插入到一个完成此类操作的时态表中:

Value1     Value2    Value3
--------------------------------
Peter      Johnson   California
Julian     Ross      Osaka

在那之后,我会与一张桌子相交,我想插入新人/人。

我认为创建一个动态字符串并使用sp_executesql调用后不是一种优雅的方法(并且将来很复杂),但我无法实现另一种方法。还有另一种方式吗?

1 个答案:

答案 0 :(得分:0)

我只想添加UNIQUE约束:

CREATE TABLE #propertiesPeople(
   ID       VARCHAR(34) NOT NULL PRIMARY KEY
  ,IDPerson INTEGER 
  ,IDProp   INTEGER 
  ,Value    VARCHAR(10)
  ,UNIQUE(IDPerson, IDProp)
);
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('1',1,1,'Peter');
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('2',1,2,'Johnson');
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('3',2,1,'John');
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('4',2,3,'01/01/1977');
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('5',1,4,'California');
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('6',3,1,'Julian');
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('7',3,2,'Ross');
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('8',3,4,'Osaka');

当有人试图插入时:

INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('9',3,4,'Osaka2');

将获得:

  

违反UNIQUE KEY约束'UQ __#properties__918436F84D776654'。   无法在对象'dbo。#propertiesPeople'中插入重复键。该   重复键值为(3,4)。

LiveDemo