Memisahkan Nilai Lajur Tunggal kepada Berbilang Lajur
Tugas membahagikan lajur tunggal yang mengandungi berbilang nilai kepada lajur berasingan boleh timbul dalam pengurusan data . Sebagai contoh, pertimbangkan jadual dengan lajur bernama "SubscriptionNumber" yang menyimpan butiran langganan dalam satu medan. Untuk menjadikan data lebih mudah diurus dan boleh diakses, kita perlu mengekstrak nilai individu ke dalam berbilang lajur.
Pendekatan Menggunakan Cross Apply dan XML
Satu kaedah untuk mencapai ini ialah dengan menggunakan teknik manipulasi silang dan manipulasi XML. Katakan kita mempunyai jadual yang dipanggil "Langganan" dengan lajur "Nombor Langganan". Data sampel dalam lajur ini adalah seperti berikut:
SC 5-1395-174-25P SC 1-2134-123-ABC C1-2 SC 12-5245-1247-14&P SC ABCD-2525-120
Untuk membahagikan nilai ini kepada lajur yang berasingan, kami boleh menggunakan pertanyaan berikut:
Declare @YourTable table (SubscriptionNumber varchar(max)) Insert Into @YourTable values ('SC 5-1395-174-25P'), ('SC 1-2134-123-ABC C1-2'), ('SC 12-5245-1247-14&P'), ('SC ABCD-2525-120') Select B.* From @YourTable A Cross Apply ( Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)'))) ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)'))) ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)'))) ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)'))) ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)'))) ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)'))) ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)'))) From (Select Cast('<x>' + replace((Select replace(replace(A.SubscriptionNumber,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A ) B
Pertanyaan ini menggunakan pangkah untuk jana satu set baris untuk setiap baris dalam jadual @YourTable. Dalam penggunaan silang, jenis data XML digunakan untuk menukar nilai SubscriptionNumber menjadi serpihan XML. Serpihan XML kemudiannya dihuraikan untuk mengekstrak nilai individu dan menetapkannya pada lajur Pos1 hingga Pos7.
Pendekatan Alternatif Menggunakan SQL Dinamik
Pendekatan SQL dinamik juga boleh digunakan untuk memisahkan lajur SubscriptionNumber kepada berbilang lajur. Pendekatan ini memerlukan penciptaan jadual sementara untuk menyimpan nilai pecahan:
Declare @YourTable table (SubscriptionNumber varchar(max)) Insert Into @YourTable values ('SC 5-1395-174-25P'), ('SC 1-2134-123-ABC C1-2'), ('SC 12-5245-1247-14&P'), ('SC ABCD-2525-120') Declare @ColNames nvarchar(max) = '' Declare @SQL nvarchar(max) = 'CREATE TABLE #TempTable (SubscriptionNumber varchar(max), ' -- Generate column names dynamically Select @ColNames += ', Col' + CAST(Row_Number() OVER (ORDER BY (SELECT NULL)) AS nvarchar(10)) From (Select * From @YourTable) AS T Cross Join (Select * From @YourTable) AS T2 -- Append column names to SQL statement Set @SQL += @ColNames + ')' -- Execute the dynamic SQL to create the temporary table Exec (@SQL) -- Insert split values into the temporary table Insert Into #TempTable Select SubscriptionNumber, ltrim(rtrim(xDim.value('/x[1]','varchar(max)'))) , ltrim(rtrim(xDim.value('/x[2]','varchar(max)'))) , ltrim(rtrim(xDim.value('/x[3]','varchar(max)'))) , ltrim(rtrim(xDim.value('/x[4]','varchar(max)'))) , ltrim(rtrim(xDim.value('/x[5]','varchar(max)'))) , ltrim(rtrim(xDim.value('/x[6]','varchar(max)'))) , ltrim(rtrim(xDim.value('/x[7]','varchar(max)'))) From @YourTable Cross Apply ( Select Cast('<x>' + replace((Select replace(replace(SubscriptionNumber,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A -- Select data from the temporary table Select * From #TempTable
Pendekatan SQL dinamik menjana pernyataan SQL secara dinamik untuk mencipta jadual sementara dengan nama lajur yang sesuai. Nilai pecahan kemudiannya dimasukkan ke dalam jadual sementara ini dan data boleh dipilih daripada jadual sementara seperti yang diperlukan.
Atas ialah kandungan terperinci Bagaimanakah saya boleh membahagikan nilai lajur tunggal yang mengandungi berbilang nilai kepada berbilang lajur dalam SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!