正如标题所述,我需要帮助转换单行数据E.g,
col1 col2 col3< - 这是列名
value1 value2 value3
类似于
dataResult< - 这是运行程序或调用的列名 的值1,值2,值3
要求是此调用(或更确切地说,过程)需要能够接受任何列长度的sql查询的结果,并且能够将该行转换为逗号分隔的字符串格式。被困在这几个星期任何帮助将不胜感激...
编辑* 假设唯一键是第一列。还假设每次查询只返回1行。永远不会出现多行。
这个想法是将该行转换为逗号分隔的字符串,而不必手动选择列名(在某种意义上自动转换查询结果)
答案 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
注意:您必须知道,如果(字符串)列中有逗号部分,则整个方法都会中断...
使用XML
或JSON
的解决方案更好。逗号分隔值已过时......
答案 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
<强>结果: - 强>