ওয়ার্কিং প্রস্তাবনা, ডাব্লু / কিছু নমুনা ডেটা, @ রেক্সটেস্টার: বিগ টেবিল আনপিবট পাওয়া যাবে
অপারেশনের সংক্ষিপ্তসার:
1 - আনপিবট অপারেশনের জন্য আমাদের কলাম তালিকাগুলি গতিশীলভাবে জেনারেটর জন্য সাইকোলোমগুলি এবং এক্সএমএল ব্যবহার করুন; সমস্ত মানগুলি ভারচারে (সর্বাধিক) রূপান্তরিত হবে, ডাব্লু / এনএইউএল স্ট্রিংকে 'নুল' রূপান্তরিত করা হবে (এই উত্সটি ইম্পিভট স্কিপিং নুল মান সহ সমস্যা সমাধান করবে)
2 - # কলামগুলি টেম্প টেবিলের মধ্যে ডেবি আনপিবট করার জন্য একটি গতিশীল ক্যোয়ারী তৈরি করুন
- কেন একজন টেম্প টেবিল বনাম কোটে (মাধ্যমে সঙ্গে দফা)? প্রচুর পরিমাণে ডেটা এবং কোনও সিটিই কোনও ব্যবহারযোগ্য সূচক / হ্যাশিং স্কিমের সাথে স্ব-যোগদানের জন্য সম্ভাব্য পারফরম্যান্স ইস্যুতে সম্পর্কিত; একটি টেম্প টেবিলটি এমন একটি সূচক তৈরির অনুমতি দেয় যা স্ব-যোগদানের ক্ষেত্রে পারফরম্যান্সকে উন্নত করা উচিত [ স্লো সিটিই স্ব-যোগদান দেখুন ]
- পিকে + কলনেম + আপডেটডেটের ক্রমে ডেটা # কলামগুলিতে লেখা হয়, যা আমাদের সন্নিহিত সারিগুলিতে পিকে / কলনেম মান সংরক্ষণ করতে দেয়; একটি পরিচয় কলাম ( মুক্তি ) আমাদের পর পরের সারিগুলিকে স্লাইড = মুক্তি + 1 এর মাধ্যমে স্ব-যোগদানের অনুমতি দেয়
3 - পছন্দসই আউটপুট জেনারেট করতে # টেম্প টেবিলের একটি স্ব যোগদান যোগদান করুন
রেক্সটেসটার থেকে কাটিং-এন-পেস্টিং ...
কিছু নমুনা ডেটা এবং আমাদের # কলামের টেবিল তৈরি করুন:
CREATE TABLE dbo.bigtable
(UpdateDate datetime not null
,PK varchar(12) not null
,col1 varchar(100) null
,col2 int null
,col3 varchar(20) null
,col4 datetime null
,col5 char(20) null
,PRIMARY KEY (PK)
);
CREATE TABLE dbo.bigtable_archive
(UpdateDate datetime not null
,PK varchar(12) not null
,col1 varchar(100) null
,col2 int null
,col3 varchar(20) null
,col4 datetime null
,col5 char(20) null
,PRIMARY KEY (PK, UpdateDate)
);
insert into dbo.bigtable values ('20170512', 'ABC', NULL, 6, 'C1', '20161223', 'closed')
insert into dbo.bigtable_archive values ('20170427', 'ABC', NULL, 6, 'C1', '20160820', 'open')
insert into dbo.bigtable_archive values ('20170315', 'ABC', NULL, 5, 'C1', '20160820', 'open')
insert into dbo.bigtable_archive values ('20170212', 'ABC', 'C1', 1, 'C1', '20160820', 'open')
insert into dbo.bigtable_archive values ('20170109', 'ABC', 'C1', 1, 'C1', '20160513', 'open')
insert into dbo.bigtable values ('20170526', 'XYZ', 'sue', 23, 'C1', '20161223', 're-open')
insert into dbo.bigtable_archive values ('20170401', 'XYZ', 'max', 12, 'C1', '20160825', 'cancel')
insert into dbo.bigtable_archive values ('20170307', 'XYZ', 'bob', 12, 'C1', '20160825', 'cancel')
insert into dbo.bigtable_archive values ('20170223', 'XYZ', 'bob', 12, 'C1', '20160820', 'open')
insert into dbo.bigtable_archive values ('20170214', 'XYZ', 'bob', 12, 'C1', '20160513', 'open')
;
create table #columns
(rid int identity(1,1)
,PK varchar(12) not null
,UpdateDate datetime not null
,ColName varchar(128) not null
,ColValue varchar(max) null
,PRIMARY KEY (rid, PK, UpdateDate, ColName)
);
সমাধানের সাহস:
declare @columns_max varchar(max),
@columns_raw varchar(max),
@cmd varchar(max)
select @columns_max = stuff((select ',isnull(convert(varchar(max),'+name+'),''NULL'') as '+name
from syscolumns
where id = object_id('dbo.bigtable')
and name not in ('PK','UpdateDate')
order by name
for xml path(''))
,1,1,''),
@columns_raw = stuff((select ','+name
from syscolumns
where id = object_id('dbo.bigtable')
and name not in ('PK','UpdateDate')
order by name
for xml path(''))
,1,1,'')
select @cmd = '
insert #columns (PK, UpdateDate, ColName, ColValue)
select PK,UpdateDate,ColName,ColValue
from
(select PK,UpdateDate,'+@columns_max+' from bigtable
union all
select PK,UpdateDate,'+@columns_max+' from bigtable_archive
) p
unpivot
(ColValue for ColName in ('+@columns_raw+')
) as unpvt
order by PK, ColName, UpdateDate'
--select @cmd
execute(@cmd)
--select * from #columns order by rid
;
select c2.PK, c2.UpdateDate, c2.ColName as ColumnName, c1.ColValue as 'Old Value', c2.ColValue as 'New Value'
from #columns c1,
#columns c2
where c2.rid = c1.rid + 1
and c2.PK = c1.PK
and c2.ColName = c1.ColName
and isnull(c2.ColValue,'xxx') != isnull(c1.ColValue,'xxx')
order by c2.UpdateDate, c2.PK, c2.ColName
;
এবং ফলাফল:
দ্রষ্টব্য: ক্ষমা চাই ... একটি কোড ব্লকে রেক্সটেসটার আউটপুট কাট-এন-পেস্ট করার সহজ উপায় বের করতে পারেনি। আমি পরামর্শ খোলা।
সম্ভাব্য সমস্যা / উদ্বেগ:
1 - জেনেরিক ভারচারে (সর্বোচ্চ) ডেটা রূপান্তরকরণের ফলে ডেটা নির্ভুলতার ক্ষতি হতে পারে যার ফলস্বরূপ আমরা কিছু ডেটা পরিবর্তন মিস করতে পারি; নিম্নলিখিত তারিখের সময় এবং ভাসমান জোড়গুলি বিবেচনা করুন যা জেনেরিক 'বর্ণের (সর্বাধিক)' এ রূপান্তরিত / কাস্ট করা হলে, তার যথার্থতা হারাবে (যেমন, রূপান্তরিত মানগুলি একই):
original value varchar(max)
------------------- -------------------
06/10/2017 10:27:15 Jun 10 2017 10:27AM
06/10/2017 10:27:18 Jun 10 2017 10:27AM
234.23844444 234.238
234.23855555 234.238
29333488.888 2.93335e+007
29333499.999 2.93335e+007
তথ্যের যথাযথতা বজায় রাখা যেতে পারে এর জন্য আরও কিছুটা কোডিং লাগবে (উদাঃ উত্স কলামের ডেটাটাইপের ভিত্তিতে কাস্টিং); আপাতত আমি ওপির সুপারিশ অনুসারে জেনেরিক ভারচার (সর্বোচ্চ) দিয়ে আটকে থাকতে পছন্দ করেছি (এবং অনুমান করা হয় যে ওপি তথ্যটি যথেষ্ট পরিমাণে জানে যে আমরা ডেটা নির্ভুল ক্ষতির কোনও সমস্যায় পড়ব না)।
2 - সত্যিই বড় সংখ্যক ডেটার জন্য আমরা কিছু সার্ভার রিসোর্স ফুটিয়ে তোলার ঝুঁকিটি চালাই, এটি টেম্পডিবি স্পেস এবং / অথবা ক্যাশে / মেমরির হোক; প্রাথমিক ইস্যুটি আনবিভোট চলাকালীন ঘটে যাওয়া ডেটা বিস্ফোরণ থেকে আসে (যেমন, আমরা 1 সারি এবং 302 টুকরো থেকে 300 সারি এবং 1200-1500 ডেটার টুকরো, পি কে এবং আপডেটডেট কলামগুলির 300 কপি, 300 কলামের নাম সহ)