Вие казвате:
We want to highlight the parameters that have changed since the last revision.
Това означава, че искате дисплеят (или отчетът) да открои променените параметри.
Ако все пак ще покажете всички параметри, би било много по-лесно да направите това програмно в предния край. Това би било много по-прост проблем в език за програмиране. За съжаление, без да знам какъв е вашият преден край, не мога да ви дам конкретни препоръки.
Ако наистина не можете да го направите в предния край, но трябва да получите тази информация в заявка от базата данни (вие казахте „само за SQL“), трябва да посочите формата, в който искате данните. A списък с една колона на колоните, които са се променили между двата записа? Списък с колони с флаг, указващ кои колони са се променили или не?
Но ето един начин, който би работил, въпреки че в процеса преобразува всичките ви полета в nvarchars, преди да направи сравнението си:
- Използвайте техниката, описана тук (отказ от отговорност:това е моят блог), за да трансформирате записите си в двойки ID-име-стойност.
-
Присъединете получения набор от данни към себе си в ID, за да можете да сравните стойностите и да отпечатате тези, които са променени:
with A as ( -- We're going to return the product ID, plus an XML version of the -- entire record. select ID , ( Select * from myTable where ID = pp.ID for xml auto, type) as X from myTable pp ) , B as ( -- We're going to run an Xml query against the XML field, and transform it -- into a series of name-value pairs. But X2 will still be a single XML -- field, associated with this ID. select Id , X.query( 'for $f in myTable/@* return <data name="{ local-name($f) }" value="{ data($f) }" /> ') as X2 from A ) , C as ( -- We're going to run the Nodes function against the X2 field, splitting -- our list of "data" elements into individual nodes. We will then use -- the Value function to extract the name and value. select B.ID as ID , norm.data.value('@name', 'nvarchar(max)') as Name , norm.data.value('@value', 'nvarchar(max)') as Value from B cross apply B.X2.nodes('/myTable') as norm(data)) -- Select our results. select * from ( select * from C where ID = 123) C1 full outer join ( select * from C where ID = 345) C2 on C1.Name = c2.Name where c1.Value <> c2.Value or not (c1.Value is null and c2.Value is null)