2012-12-04 52 views
1

我很好奇,看看這是否可能。在SQL Server 2005中將多個列作爲單逗號分隔的行返回

我有一個表或這可能是特定於任何舊錶與數據。一個簡單的SELECT將返回列和行作爲結果集。我試圖找出如果可以返回行而不是列,列連接並逗號分隔。如此預期的返回行數量,但只有一個varchar列與CSV文件一樣保存所有列的逗號分隔結果。

謝謝。

[更新]

這裏有一個更詳細的爲什麼我問。我沒有選擇在客戶端執行此操作,這是我試圖用SSIS執行的任務。

場景:我有一個在SSIS中動態創建的表,但每次構建時列名都會更改。原始軟件包使用BCP來獲取數據並將其放入平面文件,但由於作爲作業運行時的權限,BCP無法在所需的目標位置創建平面文件。我們也無法改變這一點。

另一個問題是,對於使用平面文件目標的SSIS 2005,必須映射輸入源中的列名稱,因爲列名稱不斷更改,所以我不能這樣做。

我已經寫了一個腳本任務來抓取原始表中的所有數據,然後使用流寫入器寫入CSV,但我必須循環遍歷每行然後遍歷每列以生成所有由所有數據組成的字符串列。我想用vb.net來測量sql server上的這些連接列的性能和令人討厭的循環。

如果我可以讓sql爲每一行生成一列,我可以只寫一行到文本文件,而不是迭代每列來構建行。

+2

請張貼一些示例數據,然後期望的結果。 – Taryn

+1

在客戶端上做這種事情會更有意義。在服務器上做這件事的基本原理是什麼? –

+0

@bluefeet這將適用於任何表格。 – PaulHR

回答

0

假設你知道表中有哪些列,而你不想做一些動態的,瘋狂的,你可以做到這一點

SELECT CONCAT(ColumnA, ',', ColumnB) AS ColumnZ 
FROM Table 
+0

這就是我所遇到的問題,列名是動態的,所以命名不是一個選項。 – PaulHR

0

有這種使用SQL Server的XML功能奇特的方式,但對於初學者而言,您是否可以將您關心的列的內容作爲varchar進行投射,並將它們與逗號連接起來?

SELECT cast(colA as varchar)+', '+cast(colB as varchar)+', '+cast(colC as varchar) 
FROM table 

注意,這將得到絆倒了,如果你的任何內容有逗號或在其中雙引號,在這種情況下,你也可以使用替換功能在每個投逃避它們。

+0

數據中沒有逗號或引號。我遇到的困難是由於列名 – PaulHR

0

這可能會被清除一些,但您可以通過使用存儲在sys.objectssys.columns中的元數據以及動態SQL來執行此操作。請注意,我不是動態SQL的粉絲,但出於報告目的,它不應該是太多的問題。

一些SQL來創建測試數據:

if (object_id('test') is not null) 
drop table test; 

create table test 
(
id uniqueidentifier not null default newId() 
,col0 nvarchar(255) 
,col1 nvarchar(255) 
,col2 nvarchar(255) 
,col3 nvarchar(255) 
,col4 nvarchar(255) 
); 

insert into test (col0,col1,col2,col3,col4) 
select 'alice','bob','charlie','dave','emily' 
union 
select 'abby','bill','charlotte','daniel','evan' 

一個存儲過程創建的CSV行:

-- emit the contents of a table as a CSV. 
-- @table_name: name of a permanent (in sys.objects) table 
-- @debug: set to 1 to print the generated query 
create procedure emit_csv(@table_name nvarchar(max), @debug bit = 0) 
as 

    declare @object_id int; 

    set nocount on; 

    set @object_id = object_id(@table_name); 

    declare @name nvarchar(max); 
    declare db_cursor cursor for 
     select name 
     from sys.columns 
     where object_id = @object_id; 

    open db_cursor; 
    fetch next from db_cursor into @name 

    declare @query nvarchar(max); 
    set @query = ''; 

    while @@FETCH_STATUS = 0 
    begin 
     -- TODO: modify appended clause to escape commas in addition to trimming 
     set @query = @query + 'rtrim(cast('[email protected]+' as nvarchar(max)))' 
     fetch next from db_cursor into @name; 

     -- add concatenation to the end of the query. 
     -- TODO: Rearrange @query construction order to make this unnecessary 
     if (@@fetch_status = 0) 
      set @query = @query + ' + '','' +' 
    end; 


    close db_cursor; 
    deallocate db_cursor; 

    set @query = 'select rtrim('[email protected]+') as csvrow from '[email protected]_name; 
    if @debug != 0 
    begin 
     declare @newline nvarchar(2); 
     set @newline = char(13) + char(10) 
     print 'Generated SQL:' + @newline + @query + @newline + @newline; 
    end 

    exec (@query); 

對於我的測試表,這生成查詢:

select 
rtrim(rtrim(cast(id as nvarchar(max))) 
+ ',' 
+rtrim(cast(col0 as nvarchar(max))) 
+ ',' 
+rtrim(cast(col1 as nvarchar(max))) 
+ ',' 
+rtrim(cast(col2 as nvarchar(max))) 
+ ',' 
+rtrim(cast(col3 as nvarchar(max))) 
+ ',' 
+rtrim(cast(col4 as nvarchar(max)))) 
as csvrow 
from test 

和結果集:

csvrow 
------------------------------------------------------------------------------------------- 
EEE16C3A-036E-4524-A8B8-7CCD2E575519,alice,bob,charlie,dave,emily 
F1EE6C84-D6D9-4621-97E6-AA8716C0643B,abby,bill,charlotte,daniel,evan 

建議

  1. 修改遊標循環逃避逗號
  2. 確保@table_name是指在存儲過程有效的表(if object_id(@table_name) is null
  3. 有些異常處理將是一件好事
  4. 在此設置權限,以便只有運行報表的帳戶才能執行該權限。動態SQL中的字符串串聯可能是一個很大的安全漏洞,但我沒有看到另一種方法來做到這一點。
  5. 一些錯誤處理,以確保光標被關閉和釋放可能是很好的。

這可以用於任何不是#temp表的表。在這種情況下,您必須使用tempdb..中的sys.objectssys.columns

1

我想你應該嘗試這

SELECT UserName +','+ Password AS ColumnZ 
FROM UserTable 
0
select STUFF((select ','+ convert(varchar,l.Subject) from tbl_Student B,tbl_StudentMarks L 
where B.Id=L.Id FOR XML PATH('')),1,1,'') Subject FROM tbl_Student A where A.Id=10 
相關問題