2014-10-08 3 views
1

수많은 포럼과 사이트를 검색했지만 해결책을 찾지 못했습니다. 어쩌면 나는 올바른 것을 찾지 않을 것이다. 그러나 어떤 방향과 도움도 감사 할 것이다!여러 문자열과 매개 변수를 여러 값으로 전달

UserDataServiceStats 두 테이블을 결합하려고합니다.

Title   Application 
------------ ------------- 
Site Manager KB1245;KB3256 
FTP_Viewer  FTP1536 

ServiceStats

는 다음과 같은 열 및 샘플 데이터로 구성 : UserData에는 다음과 같은 열 및 샘플 데이터로 구성

ApplicationName Vendor 
--------------- ------------ 
KB1245    Kronos 
KB3256    Kronos2 
FTP1536   File Manager 

나는 다음과 같은 출력을 얻을 필요가 테이블에 가입 :

Site Manager KB1245 Kronos 
Site Manager KB3256 Kronos2 
FTP_Viewer FTP1536 File Manager 

내 문제는에 대해 복수 ApplicationNames이있는 경우 읽고 인식하도록 조인을 얻는 것입니다..

다시 한번 도움과 안내를 부탁드립니다.

+3

'UserData.Application' 열에 데이터를 구분했습니다. ** 그렇게하지 마십시오! ** 필드에서 구분 된 데이터는 일반적인 데이터베이스 안티 패턴입니다. 각 값이 데이터베이스에 자신의 위치를 ​​갖도록 스키마를 수정하면이 조인 문제가 갑자기 어려워집니다. –

+0

나는 그것에 관해 팀에 접근했다 - 그러나 불행히도 나는 그것을 바꿀 수 없다. 구분 된 필드를 기반으로하는 몇 가지 다른 항목이 있습니다. – user3813523

답변

0

나는 OP에 약간의 여유를 줄 수있다. 개발자로서 우리는 다른 사람들이 내린 이상적인 결정보다 적게 대처해야합니다. OP가 검색해야 할 것은 StackOverflow에 톤이있는 구분 된 문자열을 분할하는 방법입니다.

내 솔루션 :

;WITH 
    cte1 AS (
     SELECT Title, 
       REPLACE(Application,' ','') + ';' AS Application 
     FROM UserData 
    ), 
    cte2 AS (
     SELECT Title, 
       LEFT(Application,CHARINDEX(';',Application)-1)  AS ApplicationName, 
       STUFF(Application,1,CHARINDEX(';',Application),'') AS RemainingApp 
     FROM cte1 
     UNION ALL 
     SELECT Title, 
       LEFT(RemainingApp,CHARINDEX(';',RemainingApp)-1), 
       STUFF(RemainingApp,1,CHARINDEX(';',RemainingApp),'') 
     FROM cte2 
     WHERE LEN(RemainingApp) > 0 
    ) 

SELECT c2.Title, 
     c2.ApplicationName, 
     s.Vendor 
FROM cte2 c2 
INNER JOIN ServiceStats s ON c2.ApplicationName = s.ApplicationName 
+0

필자는 특정 인스턴스에서 약간의 조정 작업을해야했지만, 이것이 올바른 방향을 제시해주었습니다. – user3813523

0

나는 나뿐만 아니라 여기에 가입 할 수있는 테이블 반환 함수를 사용하는 것을 선호합니다.

ALTER FUNCTION [dbo].[Split](@String VARCHAR(8000), @Delimiter CHAR(1))  
RETURNS @temptable TABLE (item VARCHAR(8000))  
AS  
BEGIN  
    DECLARE @idx INT  
    DECLARE @slice VARCHAR(8000)   
    SELECT @idx = 1  
    IF len(@String)<1 OR @String IS NULL RETURN  
    while @idx!= 0  
    BEGIN  
     SET @idx = charindex(@Delimiter,@String)  
     IF @idx!=0  
      SET @slice = LEFT(@String,@idx - 1)  
     ELSE  
      SET @slice = @String  
     IF(len(@slice)>0) 
      INSERT INTO @temptable(Item) VALUES(@slice)  
     SET @String = RIGHT(@String,len(@String) - @idx)  
     IF len(@String) = 0 break  
    END 
    RETURN  
END 

그 다음을 사용 :

SELECT * FROM dbo.Split('1;2;3;4;5',';') 

그냥 테이블처럼 작동 당신도 여기에 가입 할 수 있습니다 : 나는 그것을 사용해야하는 경우에도 내 코드 작은 수

SELECT * 
FROM dbo.Split('1;2;3;4;5',';') a 
INNER JOIN MyTable b ON a.item = b.Field1 
관련 문제