Sql server 从SQL Server中的表中获取分隔数据

Sql server 从SQL Server中的表中获取分隔数据,sql-server,sql-server-express,Sql Server,Sql Server Express,我有一个名为TBL_SUBACC的表,字段是:帐户、分支机构、Ftype、ArmCode、DrlsttrDate、CrlsttrDate、TelNo等 目前,我正在使用以下查询获取分隔的数据: select account +'|'+ branch +'|' + armcode as delimited_data from ReportingFramework.dbo.TBL_SUBACC 结果如下: delimited_data 111123|01|C0013

我有一个名为
TBL_SUBACC
的表,字段是:
帐户、分支机构、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*
从表中获取分隔数据

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);
用目标表替换_表_名称(两次)。要正确地执行此操作,您需要满足到VARCHAR和NULLs的转换。这对于datetimes来说效果很差,对于另一个软件使用管道分隔的消费来说,它的格式非常糟糕。如果你只是停在
print@nsql
上,在运行之前手动调整一下,效果会更好

用目标表替换_表_名称(两次)。要正确地执行此操作,您需要满足到VARCHAR和NULLs的转换。这对于datetimes来说效果很差,对于另一个软件使用管道分隔的消费来说,它的格式非常糟糕。如果您在运行之前停止打印@nsql并手动调整,效果会更好。

试试这个-

查询:

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
输出:

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
试试这个-

查询:

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
输出:

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

只需指定列名。有什么问题吗?@JW웃 如果不指定列名,就没有其他选项了?您的请求似乎可以正常工作。为什么要改进它?@YuliaV在表中有50多列,指定所有列名是一项耗时的工作。。你在用什么软件?在SSMS中,您可以通过右键单击生成包含所有列名的SELECT请求,然后只需复制粘贴…只需指定列名。有什么问题吗?@JW웃 如果不指定列名,就没有其他选项了?您的请求似乎可以正常工作。为什么要改进它?@YuliaV在表中有50多列,指定所有列名是一项耗时的工作。。你在用什么软件?在SSMS中,您可以通过右键单击一次来生成包含所有列名的SELECT请求,然后您只需复制粘贴…它显示
命令已成功完成。
但我看不到数据。您是否真的用表名替换了“您的表名”?它显示
命令已成功完成。
但我看不到数据。您是否已将“您的表名”替换为您的表名?