SQL-使用变量作为带有count(@Variable)的列名

SQL-使用变量作为带有count(@Variable)的列名,sql,sql-server,variables,Sql,Sql Server,Variables,我需要确定大量不同列中的重复项。我没有键入每个列名,而是尝试使用以下代码。这稍微有点效率,因为我只需要键入一次列名。但是,我得到了这个错误: 味精164,第15级,状态1,第8行 每个GROUP BY表达式必须至少包含一个非外部引用的列 declare @TheCount varchar(100) set @TheCount = 'Column_1' select @TheCount, count(@TheCount) as LineCount from staging group by @Th

我需要确定大量不同列中的重复项。我没有键入每个列名,而是尝试使用以下代码。这稍微有点效率,因为我只需要键入一次列名。但是,我得到了这个错误:

味精164,第15级,状态1,第8行 每个GROUP BY表达式必须至少包含一个非外部引用的列

declare @TheCount varchar(100)
set @TheCount = 'Column_1'
select @TheCount, count(@TheCount) as LineCount
from staging
group by @TheCount
having count(@TheCount) > 1
order by 2 desc

假设是Sql Server,此脚本可能会很有用:

CREATE TABLE TEST(
a int
)

INSERT INTO TEST VALUES(1)
INSERT INTO TEST VALUES(1)
INSERT INTO TEST VALUES(2)
INSERT INTO TEST VALUES(3)
INSERT INTO TEST VALUES(4)
INSERT INTO TEST VALUES(4)

declare @TheCount varchar(100)
set @TheCount = 'a'

EXEC('select ' + @TheCount + ', count(' + @TheCount + ') as LineCount
      from test
      group by ' + @TheCount + '
      having count(' + @TheCount + ') > 1
      order by 2 desc')
你可以试试这个例子


注意:这是一个动态Sql执行的小例子,这里有一个小解释。

如果您想使用变量作为列名,您必须了解如何使用动态Sql。看见
DECLARE @column_list varchar(4000) = 'column_name1,column_name2,column_name3,etc';

DECLARE @sql = '
  WITH dups AS (
    SELECT 
      *,ROW_NUMBER() OVER(PARTITION BY '+@column_list'+)) AS n
    FROM table_name
  SELECT * FROM dups WHERE n > 1';

EXEC @sql;