[英]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
来保留空值的“位置”,但它们将不为空,而是一个空字符串
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.