SQL过程按参数值分组

SQL过程按参数值分组,sql,sql-server,stored-procedures,dynamic,group-by,Sql,Sql Server,Stored Procedures,Dynamic,Group By,我想使用具有动态值的分组功能 例: 当我这样编写代码时,我会得到错误==> 每个GROUP BY表达式必须至少包含一个非外部引用的列 这方面有什么解决办法吗?您需要非常小心处理这类代码,因为它很容易被SQL注入 始终在标识符上使用QUOTENAME。如果列名来自用户代码,则验证它 因为@DUPLICATE_COUNTS不在动态部分的范围内,所以需要将其重新声明为输出参数 创建过程getEmpStats@COLUMN\u NAME varchar20 像 声明@DUPLICATE_COUNTS i

我想使用具有动态值的分组功能

例:

当我这样编写代码时,我会得到错误==>

每个GROUP BY表达式必须至少包含一个非外部引用的列


这方面有什么解决办法吗?

您需要非常小心处理这类代码,因为它很容易被SQL注入

始终在标识符上使用QUOTENAME。如果列名来自用户代码,则验证它

因为@DUPLICATE_COUNTS不在动态部分的范围内,所以需要将其重新声明为输出参数

创建过程getEmpStats@COLUMN\u NAME varchar20 像 声明@DUPLICATE_COUNTS int; 声明@sql nvarcharmax=N' 选择@DUPLICATE\u COUNTS=SUMDUP\u COUNTS 从…起 选择计数*作为DUP\U计数 来自emp 按“+QUOTENAME@COLUMN_NAME+N'作为一个整体; '; EXEC sp_executesql@sql,N'@DUPLICATE_COUNTS int OUTPUT',@DUPLICATE_COUNTS=@DUPLICATE_COUNTS 去 要验证列名,请使用以下代码:

如果不存在,请选择1 来自sys.c列 其中c.name=@COLUMN\u name和c.object\u id=object\u IDN'emp' 抛出50000个“不存在列”,0;
叶,动态SQL。@marc_s你的代表是魔鬼的数字@DaleK抱歉,我不知道。我为上一个问题标记了正确答案。我只是想通过传递列名来获得重复的行数。例如,该表包含NAME和AGE两列。值是{NAME:Sunil,AGE:10},{NAME:Kamal,AGE:10},{NAME:Steve,AGE:20},{NAME:Smith,AGE:20},{NAME:Jane,AGE:30}。这里我想传递列名AGE作为参数并检查总重复计数。因此,如果我们编写代码,从emp GROUP中选择COUNT AS DUP_COUNT(计数大于1的年龄),我将得到{DUP_COUNT:2},{DUP_COUNT:2}的答案。我希望答案为4。我希望已复制的行总数。像这样的2+2参数工作得非常好。非常感谢
CREATE PROCEDURE getEmpStats (@COLUMN_NAME VARCHAR(20))
AS
BEGIN
    DECLARE @DUPLICATE_COUNTS INT

    BEGIN
        SELECT @DUPLICATE_COUNTS = SUM(DUP_COUNTS)
        FROM 
            (SELECT COUNT(*) AS DUP_COUNTS
             FROM emp
             GROUP BY @COLUMN_NAME) AS A

        -------------------
    END
END