我有一个关于在使用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魔术师。
答案 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;