SQL Server:将单行转换为逗号分隔(分隔)格式

时间:2016-12-13 07:41:54

标签: sql sql-server algorithm stored-procedures

正如标题所述,我需要帮助转换单行数据E.g,

col1 col2 col3< - 这是列名 value1 value2 value3

类似于

dataResult< - 这是运行程序或调用的列名值1,值2,值3

要求是此调用(或更确切地说,过程)需要能够接受任何列长度的sql查询的结果,并且能够将该行转换为逗号分隔的字符串格式。被困在这几个星期任何帮助将不胜感激...

编辑* 假设唯一键是第一列。还假设每次查询只返回1行。永远不会出现多行。

这个想法是将该行转换为逗号分隔的字符串,而不必手动选择列名(在某种意义上自动转换查询结果)

2 个答案:

答案 0 :(得分:1)

您可以这样尝试:

模拟声明的表变量作为测试表。请注意NULL中的col2值!

DECLARE @tbl TABLE(col1 VARCHAR(100),col2 VARCHAR(100),col3 VARCHAR(100));
INSERT INTO @tbl VALUES('test1',NULL,'test3');

- 这是查询:

SELECT 
STUFF(
(
    SELECT ',' + elmt.value('.','nvarchar(max)')
    FROM
    (
    SELECT
        (
    /*YOUR QUERY HERE*/
            SELECT TOP 1 * 
            FROM @tbl
    /*--------------------*/
            FOR XML AUTO ,ELEMENTS XSINIL,TYPE
        )
    ) AS A(t)
    CROSS APPLY t.nodes('/*/*') AS B(elmt)
    FOR XML PATH('')
),1,1,'')

FOR XML AUTO将返回每行作为XML,其中包含属性中的所有值。但这会省略NULL值。在这种情况下,您返回的字符串不会包含完整的值计数。声明ELEMENT XSINIL强制引擎将NULL值包含在XML中。此CROSS APPLY t.nodes('/*/*')将所有元素作为派生表返回,其余元素将重新连接。

看到中间的双逗号!这是col2的NULL

test1,,test3

注意:您必须知道,如果(字符串)列中有逗号部分,则整个方法都会中断...

提示

使用XMLJSON的解决方案更好。逗号分隔值已过时......

答案 1 :(得分:1)

使用下一个方法: -

<强>演示: -

Create database MyTestDB
go 

Use MyTestDB
go

Create table Table1 ( col1 varchar(10), col2 varchar(10),col3 varchar(10))
go

insert into Table1 values ('Value1','Value2','Value3')
insert into Table1 values ('Value11','Value12','Value13')
insert into Table1 values ('Value21','Value22','Value23')
go


Declare @Values nVarchar(400),
        @TableName nvarchar (100),
        @Query nvarchar(max)

Set @TableName = 'Table1'
Select @Values =  Stuff(
        (
        Select '+'','' + ' + C.COLUMN_NAME
        From INFORMATION_SCHEMA.COLUMNS As C
        Where C.TABLE_SCHEMA = T.TABLE_SCHEMA
            And C.TABLE_NAME = T.TABLE_NAME
        Order By C.ORDINAL_POSITION
        For Xml Path('')
        ), 1, 2, '') 
From INFORMATION_SCHEMA.TABLES As T
where TABLE_NAME = @TableName

select @Values =  right(@Values,len(@Values)-4)

select @Query =  'select top(1)' + @Values + ' from ' + @TableName


exec sp_executeSQL @Query

<强>结果: -

enter image description here