Transact SQL将拆分字符串转换为适当的列

时间:2017-08-24 18:10:18

标签: sql-server

我的公司在许多产品中使用通用日志记录数据库。为了防止需要大量的跨数据库查询,一些信息存储在通用数据列的分隔字段中以进行日志记录。

我想对数据进行查询,但我不确定如何使用Pivot / Unpivot将数据输入到合适的列中?

下面是一个使用静态数据的通用示例,用于我想要做的事情,但不知道如何做。遗憾的是,我们在SqlServer 2016中没有内置的分割字符串功能,所以dbo.fnSplitString是我写的等效函数,可以正常工作。

 DECLARE @Columns TABLE (
     CustomerNumber VARCHAR(MAX) NOT NULL, 
     FirstName VARCHAR(MAX) NOT NULL, 
     LastName VARCHAR(MAX) NOT NULL);

/* This isn't valid SQL ... unsure how to get this to work */
INSERT INTO @Columns PIVOT SELECT * FROM dbo.fnSplitString('STUFF1,STUFF2,STUFF3',',');

SELECT * FROM @Columns;

编辑:

使用此处的示例和https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx我能够提出解决方案。拆分字符串函数还需要输出一个位置。这是受以下解决方案之一的启发,仅仅是OrdinalPosition'需要添加到函数中。生成的查询有效。

DECLARE @Columns TABLE (CustomerNumber VARCHAR(MAX) NOT NULL, FirstName VARCHAR(MAX) NOT NULL, LastName VARCHAR(MAX) NOT NULL);

INSERT INTO @Columns select [0], [1], [2] from (SELECT position, splitdata FROM  dbo.fnSplitString('STUFF1,STUFF4,STUFF3',',')) split pivot (MAX(splitdata) FOR position in ([0],[1],[2])) piv;

SELECT * FROM @Columns;

2 个答案:

答案 0 :(得分:1)

这就是你要找的东西:
我刚用过" item"作为列名。将其替换为与fnSplitString函数返回的名称对应的名称。

DECLARE @Columns TABLE (CustomerNumber VARCHAR(MAX) NOT NULL, FirstName 
VARCHAR(MAX) NOT NULL, LastName VARCHAR(MAX) NOT NULL);

 INSERT INTO @Columns
select STUFF1,STUFF2,STUFF3 from (SELECT  item FROM 
dbo.fnSplitString('STUFF1,STUFF2,STUFF3',',')) d
pivot ( max(item)  for item in (STUFF1,STUFF2,STUFF3) ) piv;

SELECT * FROM @Columns;

答案 1 :(得分:0)

如果你的函数fnSplitString返回一个表,那么只需

INSERT INTO @Columns 
SELECT * FROM dbo.fnSplitString('STUFF1,STUFF2,STUFF3',',')
PIVOT
(
MAX(ParsedValue)
FOR OrdinalPosition in ([0], [1], [2], [3])
) x