简体   繁体   English

如何选择SQL Server表作为制表符分隔的字符串

[英]How to select SQL Server table as tab delimited string

I'd like to to select a table from SQL and turn it into preferably tab delimited, otherwise CSV format. 我想从SQL中选择一个表格并将其转换为制表符分隔(最好是CSV格式)。

| col_1 | col_2 | col_3 | col_n | 
+-------+-------+-------+-------+
| data1 | data2 | data3 | data4 | 
| data5 | data6 | data7 | data8 |

Using for xml path I can get select the table as string with <tag-name> delimiters. 通过使用for xml path我可以使用<tag-name>分隔符将表选择为字符串。

let str = stuff((select * from db_name for xml path('')), 1, 1 '')

Actual output 实际产量

<col_1>data1</col_1><col_2>data2</col_2><col_3>data3</col_3><col_4>data4</col_4>
<col_5>data5</col_5><col_6>data6</col_6><col_7>data7</col_7><col_8>data8</col_8>

Expected string output 预期的字符串输出

data1   data2    data3    data4 
data5   data6    data7    data8 

The table is very wide, so using a method like concat and listing each column isn't very maintainable. 该表非常宽,因此使用诸如concat类的方法并列出每一列并不是非常可维护的。

How could I select the above table as a tab delimited string? 如何选择上表作为制表符分隔的字符串?

Notice the _RN is required in the supplying query. 注意, _RN在提供的查询中是必需的。 Could also be a TVF 也可以是TVF

Also, the ,ELEMENTS XSINIL is required to keep the "position" of null values, but they will NOT be null, bur rather an empty string 同样,必须使用,ELEMENTS XSINIL来保留空值的“位置”,但它们将不为空,而是一个空字符串

Example dbFiddle dbFiddle示例

Declare @YourTable Table ([col_1] varchar(50),[col_2] varchar(50),[col_3] varchar(50),[col_n] varchar(50))  Insert Into @YourTable Values 
 ('data1','data2','data3','data4')
,('data5','data6','data7','data8')

Select [dbo].[svf-str-Data-Tab-delimited]((Select *,_RN=Row_Number() over (Order By (Select null)) From @YourTable for XML RAW,ELEMENTS XSINIL ))

Returns 返回

data1    data2   data3   data4   
data5    data6   data7   data8   

The Function if Interested 感兴趣的函数

CREATE Function [dbo].[svf-str-Data-Tab-delimited] (@XML xml)
Returns varchar(max)
Begin
    Declare @S varchar(max) = ''
    Select @S = @S+ case when ColItem<>'_RN' then ColValue else '' end + case when ColItem='_RN' then char(13)+char(10) else char(9) end
     From (
            Select ColSeq   = row_number() over(order by (select null))
                  ,ColItem  = xAttr.value('local-name(.)', 'nvarchar(100)')
                  ,ColValue = xAttr.value('.','nvarchar(max)')
             From  @XML.nodes('/row/*') xNode(xAttr)
          ) A
     Order By ColSeq
    Return @S
End

EDIT - 编辑-

The original solution had a trailing tab. 原始解决方案带有尾随选项卡。 I also modified the function by adding parameters for the delimiter and EOL. 我还通过为定界符和EOL添加参数来修改了该功能。

Example Updated dbFiddle 示例更新了dbFiddle

Declare @YourTable Table ([col_1] varchar(50),[col_2] varchar(50),[col_3] varchar(50),[col_n] varchar(50))  Insert Into @YourTable Values 
 ('data1','data2','data3','data4')
,('data5','data6','data7','data8')

Declare @XML xml = (Select *,_RN=Row_Number() over (Order By (Select null)) From @YourTable for XML RAW,ELEMENTS XSINIL )

Select [dbo].[svf-str-Data-To-Delimited](char(9),char(13)+char(10),@XML)

Returns 返回

data1   data2   data3   data4
data5   data6   data7   data8

The Update Function 更新功能

CREATE Function [dbo].[svf-str-Data-To-Delimited] (@Delim varchar(50),@EOL varchar(50),@XML xml)
Returns varchar(max)
Begin

Return(
        Select convert(varchar(max),(
            Select case when Item='_RN' then ''
                        else case when nullif(lead(Item,1) over (Order by Seq),'_RN') is not null  
                             then concat(Value,@Delim)
                             else concat(Value,@EOL)
                        end 
                    end
             From (
                    Select Seq   = row_number() over(order by (select null))
                          ,Item  = xAttr.value('local-name(.)', 'nvarchar(100)')
                          ,Value = xAttr.value('.','nvarchar(max)')
                     From  @XML.nodes('/row/*') xNode(xAttr)
                   ) A
             Order By Seq
             For XML Path (''),TYPE).value('.', 'nvarchar(max)') )
)

End

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM