Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL从XML中选择_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

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。同样,当我没有所有的模式、数据并且看不到您键入的内容时,我很难提供帮助:-如果您运行上面的原始查询,给第一列一个别名会给所有结果行和列名,对吗?我不知道为什么这对你不起作用。很抱歉