これまで述べたように、このデザインは非常に苦労して動作します。それを修正することを検討してください。そうしないと、データベース設計との戦いに敗れ続けることになります。
要素の数が固定されているので、PARSENAMEを使用してこれらの値を分割できます。これがどのように機能するかは次のとおりです。
if OBJECT_ID('tempdb..#Something') is not null
drop table #Something
CREATE TABLE #Something
(
Name char(3)
, Location varchar(50)
, NameLink varchar(10)
, LocationLink varchar(50)
, FinalLocation varchar(50)
, Material int
)
insert #Something
select 'C50'
, '2398::3276::3916'
, 'GA-4-2'
, '58::52::24'
, '558::352::324::70'
, 93530
select * from #Something
select Name
, LEFT(Location, charindex(':', Location, 0) - 1)
, PARSENAME(replace(Location, '::', '.'), 3)
, NameLink
, PARSENAME(replace(LocationLink, '::', '.'), 3)
, PARSENAME(replace(FinalLocation, '::', '.'), 4)
, Material
from #Something
UNION ALL
select Name
, LEFT(Location, charindex(':', Location, 0) - 1)
, PARSENAME(replace(Location, '::', '.'), 2)
, NameLink
, PARSENAME(replace(LocationLink, '::', '.'), 2)
, PARSENAME(replace(FinalLocation, '::', '.'), 3)
, Material
from #Something
UNION ALL
select Name
, LEFT(Location, charindex(':', Location, 0) - 1)
, PARSENAME(replace(Location, '::', '.'), 1)
, NameLink
, PARSENAME(replace(LocationLink, '::', '.'), 1)
, PARSENAME(replace(FinalLocation, '::', '.'), 2)
, Material
from #Something
UNION ALL
select Name
, LEFT(Location, charindex(':', Location, 0) - 1)
, PARSENAME(replace(Location, '::', '.'), 4)
, NameLink
, PARSENAME(replace(LocationLink, '::', '.'), 4)
, PARSENAME(replace(FinalLocation, '::', '.'), 1)
, Material
from #Something
それぞれの位置と最終位置は常に4桁と2桁ですか? – scsimon
@scsimonいいえ、私が言及したちょうどダミー値です。それはそれぞれ4桁以上2桁以下にすることができます。 –
「デザイン」はひどいですね。区切られた列に複数の行のデータが入っています。どのような悪夢。この数の要素が固定されていると、これはうまくいく可能性がありますが、要素数が不明な場合、これは非常に難しいことが分かります。うまくいけば、この練習はこのスキーマの修正の一部です。 –