2017-01-23 22 views
1

我希望能夠將表中的所有記錄轉換爲逗號分隔列表,然後可以使用該列表插入另一個數據庫的表中。由於客戶服務器上的權限限制,當右鍵單擊數據庫名稱時,我無法訪問任何選項,到目前爲止,我發現的所有解決方案都涉及到有權這樣做(例如,任務>導出數據... )如何使用動態列創建以逗號分隔的列表

我試過使用COALESCE來做到這一點,但問題是我的表可能有任意數量的列。用戶可以隨時通過用戶界面添加/刪除列,因此我無法在select語句中對列進行硬編碼。

這是我迄今爲止寫的,使用一個簡單的CTE語句,其中有三列(RowCode,RowOrd,RowText),並將它們連接成一個我打印出來的變量。我只想找到一種方法來動態獲取這些列名,而不是硬編碼它們。我還需要考慮各種類型的列名,方法是在變量中分別輸入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表包含以下記錄

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

和可變@listStr正在打印這一點,這是正確的

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

提前感謝!

+0

什麼'選擇*'? –

+0

此外,[相關](http://stackoverflow.com/questions/600446/how-do-you-return-the-column-names-from-a-table) –

+0

如果'列可以添加/刪除任何用戶通過用戶界面的時間,然後你需要看看你在做什麼。獲得您需要的許可或告訴支付給您的人員您被拒絕執行工作的工具。 –

回答

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.S.有沒有辦法在這種情況下處理NULL值?某些記錄包含NULL值,並且它們不會顯示在輸出中。我在最裏面的select語句中嘗試了以下內容,但似乎並沒有這樣做: Select Value ='ISNULL('''+ attr.value('。','varchar(max)')+ '''','''')' 從B.XMLData.nodes('/ row')作爲A(r) 交叉應用Arnodes('./@*')AS B(attr) – Ren222

+0

@ Ren222對不起,我忘了提及NULL將被排除。我會稍微多看一下,看看能不能找出解決辦法 –

相關問題