我的公司在许多产品中使用通用日志记录数据库。为了防止需要大量的跨数据库查询,一些信息存储在通用数据列的分隔字段中以进行日志记录。
我想对数据进行查询,但我不确定如何使用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;
答案 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