Sql server TSQL从XML中选择
我有一个如下所示的存储过程:Sql server TSQL从XML中选择,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一个如下所示的存储过程: SELECT ParamValues.x1.value('likeID[1]', 'VARCHAR(60)'), COUNT(B.[userID]) AS totalLikes FROM @likeXML.nodes('/likes/like') AS ParamValues(x1) JOIN apsLikes AS B ON B.[likeID] = ParamValues.x1.value('likeID[1]', 'VARCH
SELECT
ParamValues.x1.value('likeID[1]', 'VARCHAR(60)'),
COUNT(B.[userID]) AS totalLikes
FROM
@likeXML.nodes('/likes/like') AS ParamValues(x1)
JOIN
apsLikes AS B ON B.[likeID] = ParamValues.x1.value('likeID[1]', 'VARCHAR(60)')
FOR XML PATH ('likeData'), TYPE, ELEMENTS, ROOT ('root');
但是,这将返回一个错误
列“ParamValues.x1”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中
当我尝试将它添加到GROUPBY时,它说XML不能在GROUPBY子句中使用
设置格式的正确方法是什么?其中一种方法是执行嵌套选择,如下所示:
SELECT LikeId, COUNT(Userid) FROM (
SELECT ParamValues.x1.value('likeID[1]', 'VARCHAR(60)') LikeId,
B.[userID] Userid
FROM @likeXML.nodes('/likes/like') AS ParamValues(x1)
JOIN apsLikes AS B
ON B.[likeID] = ParamValues.x1.value('likeID[1]', 'VARCHAR(60)')
FOR XML PATH ('likeData'), TYPE, ELEMENTS, ROOT ('root');
) tmp
Group By LikeId
; WITH XmlResults AS (
SELECT
ParamValues.x1.value('likeID[1]', 'VARCHAR(60)') AS likeId,
B.[userID] AS totalLikes
FROM
@likeXML.nodes('/likes/like') AS ParamValues(x1)
JOIN
apsLikes AS B ON B.[likeID] = ParamValues.x1.value('likeID[1]', 'VARCHAR(60)')
FOR XML PATH ('likeData'), TYPE, ELEMENTS, ROOT ('root')
)
SELECT likeId, COUNT(totalLikes)
FROM XmlResults
GROUP BY likeId
你试过使用CTE吗?为第一列指定别名,并删除计数。。。像这样:
SELECT LikeId, COUNT(Userid) FROM (
SELECT ParamValues.x1.value('likeID[1]', 'VARCHAR(60)') LikeId,
B.[userID] Userid
FROM @likeXML.nodes('/likes/like') AS ParamValues(x1)
JOIN apsLikes AS B
ON B.[likeID] = ParamValues.x1.value('likeID[1]', 'VARCHAR(60)')
FOR XML PATH ('likeData'), TYPE, ELEMENTS, ROOT ('root');
) tmp
Group By LikeId
; WITH XmlResults AS (
SELECT
ParamValues.x1.value('likeID[1]', 'VARCHAR(60)') AS likeId,
B.[userID] AS totalLikes
FROM
@likeXML.nodes('/likes/like') AS ParamValues(x1)
JOIN
apsLikes AS B ON B.[likeID] = ParamValues.x1.value('likeID[1]', 'VARCHAR(60)')
FOR XML PATH ('likeData'), TYPE, ELEMENTS, ROOT ('root')
)
SELECT likeId, COUNT(totalLikes)
FROM XmlResults
GROUP BY likeId
创建子查询,然后分组并使用XML“它应该可以工作:
select x1, count(Likes) from
(
SELECT
ParamValues.x1.value('likeID[1]', 'VARCHAR(60)') AS X1,
B.[userID] AS Likes
FROM
@likeXML.nodes('/likes/like') AS ParamValues(x1)
JOIN
apsLikes AS B ON B.[likeID] = ParamValues.x1.value('likeID[1]', 'VARCHAR(60)')
) t
group by X1
FOR XML PATH ('likeData'), TYPE, ELEMENTS, ROOT ('root');
我试了一下,没想过这样做,但犯了这个错误?没有为“XmlResults”的第1列指定列名。很抱歉,没有架构,我很难在本地测试。。。如果您只是在With中运行select,那么每一列是否都有一个正确的名称?出于某种原因,我得到的错误必须声明标量变量@likeXML。当我运行它时,即使我的var已经声明了?您需要用SELECT语句声明您的@likeXML selected。同样,当我没有所有的模式、数据并且看不到您键入的内容时,我很难提供帮助:-如果您运行上面的原始查询,给第一列一个别名会给所有结果行和列名,对吗?我不知道为什么这对你不起作用。很抱歉