2014-12-18 4 views
2

나는 테이블에 FirstName,LastName,Email,.......과 같은 여러 필드가 있습니다. 그래서 내가하고 싶은 것은 열의 내 경우 선택이 여러 열을 SQL에서 하나의 열로 만들기

Declare @columnNeeded nvarchar(max) 

동적 예 하나

Set @columnNeeded = 'FirstName,Email' 
Select @columnNeeded from Employee 

예제 2

Set @columnNeeded = 'FirstName,LastName' 
Select @columnNeeded from Employee 

입니다 이것은 매우 간단하다는 것이다, 이제 내가 원하는 건 상관없이 결과 집합에있는 열이 무엇이든 상관없이 하나의 열에서 com으로 선택된 모든 열이 필요합니다. ma seperated string. 나는 Group_Concat()을 mysql에서 보았지만 SQL에서이 작업을 수행하는 방법을 모른다.

답변

4

당신은 동적 SQL과 함께이 작업을 수행 할 수 있습니다

declare @sql nvarchar(max) = 'select @columns from Employee'; 
declare @columnNeeded nvarchar(max) = 'FirstName,Email'; 

set @sql = replace(@sql, '@columns', @columnNeeded); 

exec sp_executesql @sql; 

편집 :

하나 열로를 원하는 경우에

, 당신이 할 수 있습니다 :

declare @sql nvarchar(max) = 'select @columns from Employee'; 
declare @columnNeeded nvarchar(max) = 'FirstName,Email'; 

set @sql = replace(replace(@sql, '@columns', @columnNeeded), ',', '+'',''+'); 

exec sp_executesql @sql; 

당신이 할 안전 입력합니다 다음과 같이 열 값을 전송하십시오.

declare @tmp nvarchar(4000) = 'cast(' + 
           replace(@columnNeeded, ',', ', nvarchar(4000)), cast(') + 
           ', nvarchar(4000))' 
set @sql = replace(replace(@sql, '@columns', @columnNeeded), ',', '+'',''+'); 

예상대로 작동하면 목록의 각 열에 cast(<col> as nvarchar(4000))이 추가됩니다.

+0

그것의 내가 쉼표로 구분 된 문자열 – Ancient

+0

로 하나 개의 컬럼로 활용하는 방법을 예, 지금은 하나 개의 컬럼에 있지만 여전히이라는 것을 의문을 제기 여러 열을 선택하지 쉼표로 구분하지 않고 답변을 편집 할 수 있습니까? – Ancient

+0

'타입 캐스팅 오류'가 작동하지 않습니다. 모든 필드에 다른 데이터 유형이 있기 때문일 수 있습니다. 우리는이 상황에서 무엇을 할 것입니까? – Ancient

1

Dynamic SQL을 사용해야합니다. 테이블에 다른 Data types이 있으므로 convertcolumns ~ Varchar ~ concatenate의 결과를 단일 열로 입력해야 할 수 있습니다.

DECLARE @sql NVARCHAR(max), 
     @cols NVARCHAR(max) ='FirstName,Email' 

SELECT @cols = 'convert(varchar(100),' 
      + Replace(@cols+')+', ',', ')+'',''+convert(varchar(100),') 

SELECT @cols = LEFT(@cols, Len(@cols) - 1) 

SET @sql ='select ' + @cols + ' from Employee ' 

--print @sql 
EXEC Sp_executesql @sql; 

작업 예 :

CREATE TABLE #test1([Key] INT,ID INT,Value VARCHAR(2)) 

INSERT #test1 
VALUES (1,1,'C'),(2,1,'C'),(3,1,'I') 

DECLARE @sql NVARCHAR(max), 
     @cols NVARCHAR(max) ='ID,Value' 

SELECT @cols = 'convert(varchar(100),' 
      + Replace(@cols+')+', ',', ')+'',''+convert(varchar(100),') 

SELECT @cols = LEFT(@cols, Len(@cols) - 1) 

SET @sql ='select ' + @cols + ' from #test1 ' 

EXEC Sp_executesql @sql; 
+0

테이블 변수를 사용하는 경우조차도 작고 실제적인 예가 될 수 있으며 다른 유형의 열은 3 열 일 수 있습니다. 그렇지 않으면 좋아 보인다. –

+0

@srutzky - 예를 들어 내 대답을 업데이트했습니다 –

+0

고마워요. 방금 DATETIME 필드를 추가하여 테스트 해 보았습니다. 'Jan 1 2014 12:00 AM' 형식으로 변환됩니다. 물론 적절한 필드에 선택적으로 스타일 번호를 추가하는 것은 다른 재미있는 수준입니다 ;-). 어느 쪽이든, +1. –

관련 문제