2009-12-02 4 views
7

감안할 때 테이블이 자동으로 다음과 같이 생성 할 수 열 COL1, Col2의와 열 3에 "ABC"나는 고정 된 세트없이 테이블이접두사 T-SQL 문에 모든 열

SELECT 
Col1 AS 'ABC_Col1', 
Col2 AS 'ABC_Col2', 
Col3 AS 'ABC_Col3' 
FROM ABC 

을 (사용자가 Col1, Col2 등의 이름이있는 열이있는 다른 테이블의 JOIN/CTE에 필요하기 때문에) 열 접두어가 필요한 곳 ​​(사용자가 자신의 열을 추가 할 수 있음)

따라서 다음과 같이 쓸 수 있습니다.

SELECT 
T0.* AS 'ABC_T.*', 
FROM ABC T0 

물론 유효한 SQL은 아니지만 "*"열이 모두 동일한 접두사를 갖도록 어떻게 든 완료 될 수 있습니까?

답변

3

이렇게하면 기존 열 이름과 새 열 이름의 맵을 제공 할 것입니다. 나는 아직도 그걸 가지고 놀고있다.

편집

OK, 나는 그 틈을 팠다.

DECLARE @sql varchar(max) 
SET @sql = 'SELECT ' 

DECLARE @old_column_name varchar(50) 
DECLARE @getNext CURSOR 
SET @getNext = CURSOR FOR 
    SELECT syscolumns.name 
     FROM sysobjects 
      JOIN syscolumns ON sysobjects.id = syscolumns.id 
     WHERE sysobjects.name = 'ABC' 
OPEN @getNext 
FETCH NEXT FROM @getNext INTO @old_column_name 
WHILE @@fetch_status = 0 
BEGIN 

    --BUILD DYNAMIC SQL 
    SET @sql = @sql + @old_column_name + ' AS ''ABC_' + @old_column_name + ''', ' 

FETCH NEXT FROM @getNext INTO @old_column_name 
END 
CLOSE @getNext 
DEALLOCATE @getNext 

--REMOVE FINAL COMMA AND ADD TABLE 
SET @sql = SUBSTRING(@sql, 0, LEN(@sql)) + ' FROM ABC' 

exec(@sql) 

A)가 커서이기 때문에이 (끔찍한 성능입니다)

B) 난 당신이 여기에 사람들을 위해 일을하는 것은 아닙니다 거 알아,하지만 난 흥분되었다.

C) 내가 생각하는 대답이 얼마나 불만인지에 대해서는 게시하지 않았지만 아이디어는 적습니다.

+0

노력 해줘서 고마워 .. 동적 SQL보다 다른 방법이 있었으면 좋겠다. (그리고 이후로 나는이 길을 가지 않을 것 같다.) ... – RWJ

2

별칭이 어떤 열을 사용하는지 혼동하는 것 같습니다. select 절에서 볼 수 있듯이 T0.*을 참조하여 이미 T0의 입력란 만 선택하고 있습니다. 필드의 별명을 지정하지 않고도 쿼리의 해당 필드를 나중에 T0.<whatever>으로 참조 할 수 있습니다. 전체 필드 이름 (예 : T0.[My Users Suck And Make Really Long Field Names])을 참조해야합니다.

편집 : 더 명확하게하려면 별칭을 사용하여 필드 접두사를 변경할 수 없습니다. 이름은 변경할 수 있습니다. 필드의 접두사는 그것이 나오는 표의 별칭입니다.

+0

Downvoter care to comment? 내가 여기서 말한 것은 틀 렸습니다. – Donnie

+0

@Donnie : 누군가의 전술 downvoting 가능성이 높습니다 –

+0

나는 T0을 알고 있습니다. *는 To로 참조 될 수 있습니다. 하지만이 샘플은 나중에 더 많은 사전 조인과 공통 테이블 식 (Common Table Expression, CTE)에서 사용됩니다. 그리고 그 시간에 T0, T1, T2 등이있을 것입니다. 일부 필드는 동일한 열 이름을가집니다. 조인에서는 * 여전히 작동하지만 CTE에서는 같은 열 이름을 두 번 사용할 수 없습니다. – RWJ

0

내가 할 수있는 유일한 방법은 동적 SQL을 만드는 것입니다. 거기에서

SELECT syscolumns.name as old_column_name, 'ABC_' + syscolumns.name as new_column_name 
    FROM sysobjects 
     JOIN syscolumns ON sysobjects.id = syscolumns.id 
    WHERE sysobjects.name = 'ABC' 
ORDER BY sysobjects.name,syscolumns.colid 

그냥 몇 가지 동적 SQL의 :