2013-05-20 63 views
0

我有一個名爲TBL_SUBACC和字段的表:Account, Branch, Ftype, ArmCode,DrlsttrDate, CrlsttrDate, TelNo獲取分隔從表中的數據

目前我正在使用下面的查詢|分離數據:

select account +'|'+ branch +'|' + armcode as delimited_data from 
    ReportingFramework.dbo.TBL_SUBACC 

這給出結果作爲:

delimited_data 
    111123|01|C0013 
    111124|01|C0013 
    1234121|05|C0324 
    0120219|02|C0329 
    0212108|03|C3232 
    111121|01|C0013 

這正是我想要的。但是,上面的查詢需要手動給出所有文件名。 我想獲得所有字段的分隔數據而不給出所有列名稱。

如何才能從select *表中獲取分隔數據?

+2

只需指定列名。它有什麼問題? –

+0

@JW웃沒有其他選項沒有指定列名稱? –

+0

看來您的請求正常工作。你爲什麼想要改進它? –

回答

2
declare @nsql nvarchar(max); 
set @nsql = ' 
select ' + stuff((
    select '+''|''+isnull(cast(' + quotename(name) + ' as nvarchar(max)),'''') ' 
    from sys.columns 
    where object_id=object_id('YOUR_TABLE_NAME') 
    order by column_id 
    for xml path(''), type).value('/','nvarchar(max)'), 1, 5, '') + ' as delimited_data 
from YOUR_TABLE_NAME'; 
--print @nsql; 
exec (@nsql); 

用您的目標表替換YOUR_TABLE_NAME(兩次)。要做到這一點,你需要迎合轉換爲VARCHAR和NULL。對於日期時間來說,這種方式效果很差,這種方式以另一種軟件管道分隔消費的可怕格式出現。如果你只是在print @nsql停下來並在跑步前手動調整,那更好。

+0

它說'Command(s)completed successfully.',但我看不到數據。 –

+1

您是否真的用您的餐桌名稱取代了「YOUR_TABLE_NAME」? – RichardTheKiwi

1

嘗試這一個 -

查詢:

DECLARE @table_name SYSNAME 
SELECT @table_name = 'dbo.test' 

DECLARE @SQL NVARCHAR(MAX); 
SELECT @SQL = 'SELECT delimited_data = ' + STUFF((
    SELECT CHAR(13) + ' + ''|'' + ' + 
    CASE WHEN c.is_nullable = 1 
     THEN 'ISNULL(CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX)),'''') ' 
     ELSE 'CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX))' 
    END 
    FROM sys.columns c WITH (NOWAIT) 
    WHERE c.[object_id] = OBJECT_ID(@table_name) 
    ORDER BY c.column_id 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 10, CHAR(13)) + ' 
FROM ' + @table_name 

PRINT @SQL 

EXEC sys.sp_executesql @SQL 

輸出:

SELECT delimited_data = 
      CAST([WorkOutID] AS NVARCHAR(MAX)) 
    + '|' + CAST([DateOut] AS NVARCHAR(MAX)) 
    + '|' + CAST([EmployeeID] AS NVARCHAR(MAX)) 
    + '|' + CAST([DepartmentUID] AS NVARCHAR(MAX)) 
    + '|' + ISNULL(CAST([WorkPlaceUID] AS NVARCHAR(MAX)), '') 
    + '|' + ISNULL(CAST([CategoryID] AS NVARCHAR(MAX)), '') 
FROM dbo.test