За този тип разделяне на данни бих предложил да създадете функция за разделяне:
create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1)) връща @temptable TABLE (items varchar(MAX)) като начало декларира @idx int declare @slice. varchar(8000) изберете @idx =1, ако len(@String)<1 или @String е нула, връщане, докато @idx!=0 начало set @idx =charindex(@Delimiter,@String) ако @idx!=0 set @ slice =left(@String,@idx - 1) else set @slice =@String if(len(@slice)>0) вмъкнете в @temptable(Items) стойности(@slice) set @String =right(@String, len(@String) - @idx) ако len(@String) =0 прекъсване край връщане край;
След това, за да използвате това в заявка, можете да използвате външно прилагане
за да се присъедините към съществуващата си таблица:
изберете t1.code, s.items декларация от вашата таблица t1outer apply dbo.split(t1.declaration, ',') s
Което ще доведе до резултат:
<предварителен код>| КОД | ДЕКЛАРАЦИЯ |-----------------------| 123 | a1-2 № || 123 | a2- 230 бр. || 123 | a3 - 5nos |Вижте SQL Fiddle с демонстрация
Или можете да приложите CTE версия, подобна на тази:
;с cte (код, DeclarationItem, Declaration) като( изберете Code, cast(left(Declaration, charindex(',',Declaration+',')-1) като varchar(50)) DeclarationItem, неща (Декларация, 1, charindex(',',Декларация+','), '') Декларация от вашия съюз на таблицата all select code, cast(left(Declaration, charindex(',',Declaration+',')-1) като varchar (50)) DeclarationItem, stuff(Declaration, 1, charindex(',',Declaration+','), '') Декларация от cte, където Declaration> '') изберете код, DeclarationItemfrom cte