2017-01-23 2 views
1

テーブル内のすべてのレコードをカンマ区切りのリストに入れて、別のデータベースのテーブルに挿入できるようにしたいと考えています。顧客のサーバーの権限の制限により、データベース名を右クリックするとオプションにアクセスすることができません。これまでに見つかったすべてのソリューションには権限があります(たとえば、タスク>データのエクスポート...)。 )動的列を持つテーブルからコンマ区切りリストを作成する方法

私はこれを行うためにCOALESCEを使用しようとしましたが、問題は私のテーブルが任意の数の列を持つことができるということです。列はユーザ​​ーによってUIを介していつでも追加/削除できます。したがって、select文で列をハードコーディングすることはできません。

ここでは、3つの列(RowCode、RowOrd、RowText)があり、それらを印刷する変数に連結する単純なCTE文を使用して、これまで書いたことがあります。これらの列名をハードコーディングするのではなく、動的に取得する方法を探したいだけです。変数にvarcharとそれぞれキャストして、さまざまなタイプの列名を考慮する必要もあります。

DECLARE @listStr VARCHAR(MAX) 

;WITH tableData AS 
(
    SELECT * 
    FROM tableRows 
) 
SELECT 
    @listStr = ISNULL(@listStr + 'select ','select ') + '''' + RowCode + ''',''' + cast(RowOrd as varchar) + ''',''' + RowText + '''' + Char(13) 
FROM 
    tableData 

PRINT @listStr 

tableRowsテーブルには、現在、事前に

select 'RowA','1.00','Row A' 
select 'RowB','2.00','Row B' 

おかげで正しいれ、これを、印刷された次のレコード

RowCode RowOrd RowText 
----------------------- 
RowA 1  Row A 
RowB 2  Row B 

、変数@listStrが含まれています!

+0

自分の価値観を "文字列化"? –

+0

また、[関連](http://stackoverflow.com/questions/600446/how-do-you-return-the-column-names-from-a-table) –

+0

'カラムを追加/削除することができますユーザがUIを介して時間を過ごすと、あなたは何をしているのかを知る必要があります。必要な許可を得るか、仕事をするためのツールが拒否されていることを支払っている人々に伝えます。 –

答えて

2

XMLのビットを使用すると、動的に収集することができますし、どのような `` *選択について

Declare @tableRows table (RowCode varchar(50), RowOrd int, RowText varchar(50)) 
Insert Into @tableRows values 
('RowA',1,'Row A'), 
('RowB',2,'Row B') 

Declare @listStr VARCHAR(MAX) = '' 

Select @listStr = @listStr + C.String + char(13) 
From @tableRows A 
Cross Apply (Select XMLData = cast((Select A.* for XML RAW) as xml)) B 
Cross Apply (
       Select String = 'select '+Stuff((Select ',' +Value 
       From (
         Select Value = ''''+attr.value('.','varchar(max)')+'''' 
         From B.XMLData.nodes('/row') as A(r) 
         Cross Apply A.r.nodes('./@*') AS B(attr) 
        ) X 
       For XML Path ('')),1,1,'') 
      ) C 

Select @listStr 

戻り

select 'RowA','1','Row A' 
select 'RowB','2','Row B' 
+0

ありがとう、これは私が探していたものです!私はXMLの使用が好きで、それを考えなかった。 – Ren222

+0

P.このコンテキストでNULL値を処理する方法はありますか?レコードの一部にNULL値が含まれており、出力に表示されません。私は最も内側のselectステートメントで次のことを試しましたが、それはそのトリックを行うようには見えません: 値の選択= 'ISNULL(' '' + attr.value( '。'、 'varchar(max)')+ B.XMLData.nodes( '/ row')からA(r) 交差適用Arnodes('./@* ')AS B(attr) – Ren222

+0

@ Ren222申し訳ありません、私はNULLが除外されることに言及することを忘れました。私は回避策を出すことができるかどうかを確認するためにもう少しヌードルをします –

関連する問題