Bạn nói:
We want to highlight the parameters that have changed since the last revision.
Điều này ngụ ý rằng bạn muốn hiển thị (hoặc báo cáo) làm cho các thông số đã thay đổi trở nên nổi bật.
Nếu bạn vẫn hiển thị tất cả các tham số, sẽ dễ dàng hơn rất nhiều để thực hiện điều này theo chương trình trong giao diện người dùng. Nó sẽ là một vấn đề đơn giản hơn nhiều trong một ngôn ngữ lập trình. Rất tiếc, không biết giao diện người dùng của bạn là gì, tôi không thể đưa ra đề xuất cụ thể cho bạn.
Nếu bạn thực sự không thể làm điều đó trong giao diện người dùng nhưng phải nhận thông tin này trong một truy vấn từ cơ sở dữ liệu (bạn đã nói "Chỉ SQL"), bạn cần chỉ định định dạng bạn muốn dữ liệu. A danh sách một cột của các cột đã thay đổi giữa hai bản ghi? Danh sách các cột có cờ cho biết cột nào đã thay đổi hoặc không thay đổi?
Nhưng đây là một cách sẽ hoạt động, mặc dù trong quá trình này, nó chuyển đổi tất cả các trường của bạn thành nvarchars trước khi thực hiện so sánh:
- Sử dụng kỹ thuật được mô tả ở đây (tuyên bố từ chối trách nhiệm:đó là blog của tôi) để chuyển đổi các bản ghi của bạn thành các cặp ID-tên-giá trị.
-
Nối tập dữ liệu kết quả với chính nó trên ID, để bạn có thể so sánh các giá trị và in các giá trị đã thay đổi:
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)