2011-12-09 27 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 

そして、私はこのような列の名前を変更したいと思います:

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

quotabase()呼び出しがいくつか追加されました。 –

2

純粋なSQLで簡単な方法はありませんが、主なオプションは、構築することです動的SQLクエリを使用するか、1つの結果セットを返すだけで、プレゼンテーションレイヤで処理できます。

しかし、大きな疑問は、データとメタデータを同じテーブルに混ぜている理由です。 1つの行に列名があり、その他すべてがデータである場合は、正しい列名を持つ表を作成し、その列にデータをロードします。あなたはCSVファイルを読み込んでいるようだから、ほとんどの作業をuse SSISすることができます。

+0

問題は、テーブルを動的に作成する必要があるということであるいくつかのCSVファイルを1つのフォルダに存在し、各ファイルが異なるヘッダのセット(同じなし同じを持っています)。最終的な目標は、これらのcsvファイルのすべてから1つのフォルダ内のデータを取得し、それらを1つのテーブルに結合することです。 – neilrudds

+0

SSISが常に利用可能なわけではありません(SQL Server Expressなど) –

+0

ファイル内のデータ、達成しようとしていることなどを知らなくても、最良の解決策が何であるかは言うまでもありません。ソースファイルが常に同じ構造を持っている場合は、すべての列で事前に1つの表を作成し、各ファイルを列名または位置でロードすることができます。使用する言語でSSISまたは外部スクリプトを使用できます。しかし、すべてがダイナミックで未知のものであれば、それに対処するための独自のコードを書く必要があります。 – Pondlife

0

これまで同様の問題がありました。 SSISのような他のツールを習得することは高い学習曲線を持ち、ここで一度しか使用しない(アドホックソリューション)ため、経済的ではありません。一方、純粋なT-SQLに書き込むには、カタログビュー(メタデータ)にアクセスしてそれらをカーソルと混合するか、テーブルごとにクロスアプライ機能を使用する必要があります。

私はシンプルなソリューションを提案している:あなたは一度だけそれをしたい、とあなたのテーブルが10個のまたは20のテーブルが言う以上でない場合は、単に新しいデータベースに手でそれらを作成、

  1. をし、単純な挿入クエリを作成して新しいテーブルを作成し、望ましくない行を削除します。
  2. テーブルがたくさんあり、20以上のテーブルがある場合、またはこのプロセスを何度も(大規模なソリューションの一部として)実行したい場合は、.NETで行うことを単純に実行します。つまり、データベース内のすべてのテーブルのリストをコード内で取得し、各テーブルに対して最初の行を取得し、対応する列タイトルなどを含む新しいテーブルを作成します。ここでの主なポイントは、 .NETの環境では、T-SQLよりも強力です。
関連する問題