2015-10-17 53 views
0

我有「性」與動態值從行值的列創建一個表

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使循環圍繞「propertiesToValidate」的,這選擇將完成類似:

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調用是不是一個優雅的方式來做到這一點(並且將來很複雜),但我無法實現另一種方式來做到這一點。有另一種方法嗎?

回答

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'); 

將獲得:唯一鍵約束的

違反「UQ __# propert__918436F84D776654' 。 無法在對象'dbo。#propertiesPeople'中插入重複鍵。 (3,4)。 重複鍵值是(3,4)。

LiveDemo

+0

的人會是一個新的。我不想創建一個新的人,例如創建3個新行: 9,4,1'Peter'|||| 9,4,2,Johnson |||| 9,4,4,'加州'。 要驗證的屬性的數量和值取決於另一個表。 – popiandro

+0

@popiandro那麼分享這個表格的另一個例子 – lad2025

+0

這個表格只需要驗證屬性的ID(好吧,它會有更多的列,但對於這個問題並不重要) – popiandro