我已经找到了很多这方面的材料,但是我找不到任何特定的方案来帮助我解决问题并摆脱错误,
Msg 512,Level 16,State 1,Line 1
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。声明已经终止。
我遇到问题的存储过程部分如下。
set @strSql = 'update ' + @tableName
+ ' set unique_subs_'+@FieldName + ' = (select isnull(COUNT(distinct a.wr_unique_subs),0)
from tbl_Cluster_Subs_revenue a, tbl_Cell_info b
where a.wr_cell_id = b.CI group by b.Cluster_Name)'
exec(@strSql)
非常感谢一些指导。
答案 0 :(得分:0)
尝试更改isnull函数的位置,如下所示:
set @strSql = 'update ' + @tableName
+ ' set unique_subs_'+@FieldName + ' = isnull((select COUNT(distinct a.wr_unique_subs)
from tbl_Cluster_Subs_revenue a, tbl_Cell_info b
where a.wr_cell_id = b.CI group by b.Cluster_Name),0) '
exec(@strSql)
答案 1 :(得分:0)
有什么不清楚的?子查询返回多个值。你需要选择其中一个。我还建议使用标准join
语法,而不是隐式连接到where
子句。
您可以使用top 1
:
update ' + @tableName + '
set unique_subs_'+@FieldName + ' = (select top 1 isnull(COUNT(distinct a.wr_unique_subs),0)
from tbl_Cluster_Subs_revenue a join
tbl_Cell_info b
on a.wr_cell_id = b.CI
group by b.Cluster_Name
);
(仅仅因为你将SQL放在一个字符串中并不意味着它必须格式化.SQL Server允许字符串中的行尾字符。)
但是,我猜你可能想要这样的东西:update ' + @tableName + '
set unique_subs_'+@FieldName + ' = (select COUNT(distinct a.wr_unique_subs)
from tbl_Cluster_Subs_revenue a join
tbl_Cell_info b
on a.wr_cell_id = b.CI
where Cluster_Name = ''' + @FieldName + '''
)
您实际上并不需要isnull()
,因为如果没有匹配的行,count()
会返回0
。