Эта функция должна дать вам то, что вам нужно.
--Drop Function Dbo.Part
Create Function Dbo.Part
(@Value Varchar(8000)
,@Part Int
,@Sep Char(1)='-'
)Returns Varchar(8000)
As Begin
Declare @Start Int
Declare @Finish Int
Set @Start=1
Set @Finish=CharIndex(@Sep,@Value,@Start)
While (@Part>1 And @Finish>0)Begin
Set @Start=@Finish+1
Set @Finish=CharIndex(@Sep,@Value,@Start)
Set @Part=@Part-1
End
If @Part>1 Set @Start=Len(@Value)+1 -- Not found
If @Finish=0 Set @Finish=Len(@Value)+1 -- Last token on line
Return SubString(@Value,@Start,@Finish-@Start)
End
Использование:
Select ID
,Dbo.Part(Name,1,Default)As Name
,Dbo.Part(Name,2,Default)As Name1
,Dbo.Part(Name,3,Default)As Name2
From Dbo.Table1
Это довольно трудоемкий процесс, поэтому если Table1 очень длинный, вам следует записывать результаты в другую таблицу, которую вы можете обновлять время от времени (возможно, один раз в день, ночью).
Еще лучше, вы можете создать триггер, который автоматически обновляет Таблицу 2 при каждом изменении Таблицы1. Предполагая, что идентификатор столбца является первичным ключом:
Create Table Dbo.Table2(
ID Int Constraint PK_Table2 Primary Key,
Name Varchar(8000),
Name1 Varchar(8000),
Name2 Varchar(8000))
Create Trigger Trigger_Table1 on Dbo.Table1 After Insert,Update,Delete
As Begin
If (Select Count(*)From Deleted)>0
Delete From Dbo.Table2 Where ID=(Select ID From Deleted)
If (Select Count(*)From Inserted)>0
Insert Dbo.Table2(ID, Name, Name1, Name2)
Select ID
,Dbo.Part(Name,1,Default)
,Dbo.Part(Name,2,Default)
,Dbo.Part(Name,3,Default)
From Inserted
End
Теперь сделайте ваши манипуляции с данными (Вставка, Обновление, Удалить) в Таблице 1, но вместо этого сделайте ваши операторы Выбрать в Таблице 2.