Sql 用子查询返回的多行更新一列
我在这方面找到了很多资料,但我找不到任何特定于我的场景的资料来帮助我解决问题并消除错误 Msg 512,16级,状态1,第1行 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 声明已终止 我的存储过程中遇到问题的部分如下Sql 用子查询返回的多行更新一列,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我在这方面找到了很多资料,但我找不到任何特定于我的场景的资料来帮助我解决问题并消除错误 Msg 512,16级,状态1,第1行 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 声明已终止 我的存储过程中遇到问题的部分如下 set @strSql = 'update ' + @tableName + ' set unique_subs_'+@FieldName + ' = (select isnull(COUNT(distinct a.wr_unique_subs),0)
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)
请提供一些指导。尝试按如下方式更改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)
什么是不清楚的?子查询返回多个值。你需要从中选择一个。我还建议在where子句中使用标准联接语法,而不是隐式联接 您可以使用前1项解决此问题: 将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
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 + '''
)