将存储过程中的静态SQL查询转换为动态SQL

问题描述 投票:0回答:1

我已经编写了这样的存储过程,

Alter PROCEDURE sp_bestReviewer_report 
                (
                @StartingLetter AS VARCHAR(1),
                @CountsReq AS DECIMAL(3),
                @ReqRev AS INT
                @RequiredColumn AS SYSNAME
                )
        AS
        BEGIN
            SELECT TOP(@ReqRev) @RequiredColumn, Count(Reviewer) AS Total FROM [reviews_not_sent] WHERE LEFT(Reviewer,1) = @StartingLetter 
            GROUP BY (Reviewer) 
            HAVING (Count(Reviewer) > @CountsReq OR Count(Reviewer) < @CountsReq) 
            ORDER BY    
            Total DESC;
        END;

我试图动态地将@RequiredColumn(必需的列)作为参数传递给存储过程。

我该怎么做。

sql sql-server
1个回答
1
投票

您需要动态SQL来传递列名:

BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = '
SELECT TOP (@ReqRev) [RequiredColumn], Count(Reviewer) AS Total
FROM [reviews_not_sent]
WHERE LEFT(Reviewer, 1) = @StartingLetter 
GROUP BY Reviewer 
HAVING Count(Reviewer) <> @CountsReq 
ORDER BY Total DESC
';

    SET @sql = REPLACE(@sql, '[RequiredColumn]', QUOTENAME(@RequiredColumn));

    EXEC sp_executesql @sql,
                       N'@ReqRev int, @StartingLetter VARCHAR(1), @CountsReq DECIMAL(3)',
                       @ReqRev=@ReqRev, @StartingLetter=@StartingLetter, @CountsReq=@CountsReq;
END;
© www.soinside.com 2019 - 2024. All rights reserved.