2011-12-09 4 views
5

테이블의 열 이름을 테이블의 첫 번째 레코드 세트 이름으로 바꾸는 SQL 쿼리를 실행하려고합니다.테이블의 필드 값이있는 SQL 테이블의 열 이름을 바꿉니다.

COL1 | COL2 | COL3 | COL4 | COL5 | COL6 

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 
tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

그리고이 같은 열 이름을 변경하고 싶습니다 :

내 표는 다음과 같습니다 순수 SQL에서 간단한 방법이 없습니다

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 

tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

답변

4

이 절차는 필요한 것을 수행합니다. 절차는 "첫 번째"행은 디스크의 물리적 인 첫 번째 행 있다고 가정

exec p_rename_columns N'<mytable>' 

참고 : 다음과 같이 실행할 수 있습니다. 이 값은 테이블의 클러스터 된 인덱스가 사용하는 필드에 따라 변경 될 수 있으므로 100 % 보장되지 않습니다.

절차의 코드 :

create proc p_rename_columns (@table sysname) 
AS 

declare @name sysname, 
     @col sysname, 
     @sql nvarchar(max) 

declare cur cursor 
local read_only 
for select name 
     from sys.columns 
    where object_id = object_id(@table) 

open cur 
fetch next from cur into @name 

while @@fetch_status = 0 
    begin 

    select @sql = N'select top (1) @col = ' + quotename(@name) + N' from ' + quotename(@table) 
    exec sp_executesql @sql, N'@col sysname output', @col output 

    select @sql = N'exec sp_rename ''' + quotename(@table) + N'.' + quotename(@name) + N''', ''' + @col + N'''' 
    exec (@sql) 

    fetch next from cur into @name 
    end 
close cur 
deallocate cur 

select @sql = N'DELETE TOP (1) from ' + quotename(@table) 
exec (@sql) 
GO 
+0

완벽한, 이것에 대한 sooo 많이 감사합니다 정확히 내가 뭘 !! – neilrudds

+0

몇 가지 누락 된 quotename() 호출을 추가했습니다. –

2

, 주요 옵션은 구축 할 수 있습니다 동적 SQL 쿼리를 사용하거나 단일 결과 세트를 반환하고 프리젠 테이션 레이어에서 처리하도록 할 수 있습니다.

하지만 더 큰 질문은 같은 테이블에 데이터와 메타 데이터를 혼합하는 이유입니다. 한 행에 열 이름이 있고 그 밖의 모든 데이터가 데이터이면 올바른 열 이름으로 테이블을 만들고 그 안에 데이터를로드하십시오. CSV 파일을로드하는 것으로 보이므로 use SSIS을 사용하면 대부분의 작업을 수행 할 수 있습니다.

+0

문제는 테이블이 하나 개의 폴더에 여러 개의 CSV 파일이 있습니다, 동적으로 생성 될 필요가 있다는 것입니다 각각의 파일은 다른 헤더 세트 (동일한없이 동일있다). 궁극적 인 목표는 하나의 폴더에있는 모든 CSV 파일에서 데이터를 검색하여 하나의 테이블로 결합하는 것입니다. – neilrudds

+0

SSIS를 항상 사용할 수있는 것은 아닙니다 (예 : SQL Server Express) –

+0

파일의 데이터, 달성하려는 내용 등을 모른 채 최상의 솔루션이 무엇인지 말할 수 없습니다. 머리글이 무엇인지 미리 알고 있다면 그리고 소스 파일이 항상 동일한 구조를 갖는다면, 모든 컬럼을 가진 하나의 테이블을 미리 생성 할 수 있고 컬럼 이름이나 위치별로 각 파일을로드 할 수 있습니다. 원하는 언어로 SSIS 또는 외부 스크립트를 사용할 수 있습니다.그러나 모든 것이 역동적이고 사전에 알려지지 않은 경우이를 처리 할 수있는 고유 한 코드를 작성해야합니다. – Pondlife

0

우리는 비슷한 문제가 발생했습니다. SSIS와 같은 다른 도구를 배우는 것은 높은 학습 곡선을 가지며 여기서는 한 번만 사용하기 때문에 경제적이지는 않습니다 (특별 솔루션). 반면 순수 T-SQL로 쓰려면 카탈로그 뷰 (메타 데이터)에 액세스하여 커서와 혼합하거나 각 테이블에 대해 교차 적용 기능을 사용해야합니다. 이는 또한 어렵습니다.

내가 간단한 솔루션 제안 : 당신이 한 번만 수행 할 경우

  1. 을하고 테이블이 10 개 또는 20 테이블을 말한다 이하입니다, 간단히 새 데이터베이스에 손을 작성하고, 간단한 삽입 쿼리를 작성하여 새 테이블을 채우고 원하지 않는 행을 제거하십시오.
  2. 테이블이 많고 테이블이 20 개 이상인 경우 또는이 프로세스를 여러 번 (큰 솔루션의 일부인) 여러 번 수행하려는 경우 .NET에서 수행 할 작업을 수행하십시오. 즉, 코드에서 데이터베이스의 모든 테이블 목록을 가져온 다음 각 테이블에 대해 첫 번째 행을 가져온 다음 해당 열 제목이있는 새 테이블을 만듭니다. 여기서 중요한 점은, .NET 환경에서 T-SQL보다 훨씬 강력합니다.
관련 문제