2013-04-30 24 views
1

我正在將數據從一個數據庫遷移到另一個數據庫以用於醫院。在舊的數據庫中,醫生的專業ID全部位於一列(swvar_specialties)中,每個都用逗號分隔。在新的數據庫中,每個專業ID都會有自己的專欄(例如:專業1_PrimaryID,專業2_PrimaryID,專業3_PrimaryID等)。我正試圖從舊數據庫中導出數據,並將這些數據分隔到這些單獨的列中。我知道我可以使用indexofsubstring來做到這一點 - 我只需要語法幫助。使用IndexOf和/或Substring將數據解析到單獨的列中

所以這個查詢:

Select swvar_specialties as Specialty1_PrimaryID 
From PhysDirectory 

可能會返回類似於39,52,16的結果。我需要此查詢在結果中顯示Specialty1_PrimaryID = 39Specialty2_PrimaryID = 52Specialty3_PrimaryID = 16。以下是我迄今爲止的查詢。我最終會加入從專業表中提取專業名稱。我只需要先解決這個問題。

Select pd.ref as PrimaryID, pd.swvar_name_first as FirstName, pd.swvar_name_middle as MiddleName, 
pd.swvar_name_last as LastName, pd.swvar_name_suffix + ' ' + pd.swvar_name_degree as NameSuffix, 
pd.swvar_birthdate as DateOfBirth,pd.swvar_notes as AdditionalInformation, 'images/' + '' + pd.swvar_photo as ImageURL, 
pd.swvar_philosophy as PhilosophyOfCare, pd.swvar_gender as Gender, pd.swvar_specialties as Specialty1_PrimaryID, pd.swvar_languages as Language1_Name 
From PhysDirectory as pd 
+0

只有一個評論,但專業的多列不是第3範式。應該有DrID,SpecialtyID表,Dr博士可以有零或許多專業。 – Paparazzi 2013-04-30 19:28:07

回答

0

文章Split function equivalent in T-SQL?提供有關如何使用拆分功能拆分逗號分隔字符串的一些細節。

通過修改表值函數在這篇文章中提出,以提供身份列,我們可以針對特定的行如Specialty1_PrimaryID:

/* 
    Splits string into parts delimitered with specified character. 
*/ 
CREATE FUNCTION [dbo].[SDF_SplitString] 
(
    @sString nvarchar(2048), 
    @cDelimiter nchar(1) 
) 
RETURNS @tParts TABLE (id bigint IDENTITY, part nvarchar(2048)) 
AS 
BEGIN 
    if @sString is null return 
    declare @iStart int, 
     @iPos int 
    if substring(@sString, 1, 1) = @cDelimiter 
    begin 
     set @iStart = 2 
     insert into @tParts 
     values(null) 
    end 
    else 
     set @iStart = 1 
     while 1=1 
     begin 
      set @iPos = charindex(@cDelimiter, @sString, @iStart) 
      if @iPos = 0 
      set @iPos = len(@sString)+1 
      if @iPos - @iStart > 0   
      insert into @tParts 
       values (substring(@sString, @iStart, @[email protected])) 
      else 
      insert into @tParts 
       values(null) 
      set @iStart = @iPos+1 
      if @iStart > len(@sString) 
      break 
     end 
    RETURN 
END 

你的查詢可以利用這種分裂的功能如下:

​​
相關問題