在MS SQL Server中的Pivot查询中使用EXECUTE sp_executesql和paramter

时间:2016-10-20 15:01:00

标签: sql sql-server sql-server-2008

我有一个关于在使用EXECUTE sp_executesql运行脚本时如何在pivot中赋予参数的查询。

DECLARE @FactorText AS NVARCHAR(MAX)
DECLARE @RequestID AS NVARCHAR(MAX)

   SELECT @FactorText = COALESCE(@FactorText + '], ', '') + CAST('[' + FactorText AS NVARCHAR(MAX))
   FROM (
         SELECT DISTINCT FactorText 
         FROM QuoteHODFCreditDebit 
         where RequestId = @RequestID AND AppliedValue!=0.00
    ) AS QuoteHODFCreditDebit

    SET  @FactorText =  @FactorText + ']'

    DECLARE @DynamicPIVOT AS NVARCHAR(MAX)
    DECLARE @ParmDefinition AS NVARCHAR(MAX)
    SELECT @DynamicPIVOT = 'SELECT @FactorText
             FROM 
            (
                SELECT case
                   when(appliedValue < 0) then quotename(convert(nvarchar(100), ABS(AppliedValue)),''('')
                     else CONVERT(nvarchar(100),AppliedValue)
                  end as AppliedValue,  FactorText FROM
                     QuoteHODFCreditDebit where RequestId = @ResRequest
                     and appliedValue!=0.00
            ) CreditDebitFactor
            PIVOT (
                MAX(AppliedValue) FOR FactorText IN (@FactorText)
            ) Result;'

SET @ParmDefinition = N'@ResRequest NVARCHAR(MAX),@FactorText NVARCHAR(MAX)';

EXECUTE sp_executesql @DynamicPIVOT, @ParmDefinition, @ResRequest = @RequestID, @FactorText = @FactorText;

在上面的查询中,@ ResRequest参数没有引发任何错误,但是作为参数@FactorText引发了错误。

  

错误:'@FactorText'附近的语法不正确。

请解决此问题。

如果您有我的要求的示例,那么您可以发布。

提前感谢所有SQL魔术师。

1 个答案:

答案 0 :(得分:1)

您无法在in子句或选择列表中使用变量。如果可以的话,根本不需要动态SQL。

如果您拥有当前版本的SQL Server,则可以使用函数调用而不是动态SQL来执行此操作。

以下是使用动态SQL的方法:

   SELECT @DynamicPIVOT = 'SELECT '+@FactorText+'
             FROM 
            (
                SELECT case
                   when(appliedValue < 0) then quotename(convert(nvarchar(100), ABS(AppliedValue)),''('')
                     else CONVERT(nvarchar(100),AppliedValue)
                  end as AppliedValue,  FactorText FROM
                     QuoteHODFCreditDebit where RequestId = @ResRequest
                     and appliedValue!=0.00
            ) CreditDebitFactor
            PIVOT (
                MAX(AppliedValue) FOR FactorText IN ('+@FactorText+')
            ) Result;'

SET @ParmDefinition = N'@ResRequest NVARCHAR(MAX)';

EXECUTE sp_executesql @DynamicPIVOT, @ParmDefinition, @ResRequest = @RequestID;