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 *从表中获取分隔数据?

4

2 回答 2

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并手动调整它,那就更好了。

于 2013-05-20T09:56:12.350 回答
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
于 2013-05-20T10:27:22.880 回答