1

我在这方面找到了很多材料,但我找不到任何特定于我的场景的东西来帮助我解决我的问题并摆脱错误,

消息 512,级别 16,状态 1,第 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)

希望得到一些指导。

4

2 回答 2

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)
于 2013-07-23T13:27:56.007 回答
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

于 2013-07-23T13:29:31.680 回答