2016-10-20 122 views
-2

我有一個關於如何在使用EXECUTE sp_executesql運行腳本時給予數據透視參數的查詢。在EXECUTE sp_executesql中使用參數在MS SQL Server中查詢查詢

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

爲什麼所有的DBMS標籤? – Aleksej

+1

您需要小心,不要標記每個DBMS。這顯然是SQL服務器。錯誤的原因是因爲@FactorText超出了動態SQL的範圍。 –

+0

您不能在IN子句或選擇列表中使用變量 – Hogan

回答

1

您不能在in子句或選擇列表中使用變量。如果你可以的話,你根本不需要動態SQL。

如果您擁有當前版本的SQL Server,則可以使用函數調用而不是動態SQL來完成此操作。

這裏是你如何使用動態SQL做到這一點:

SELECT @DynamicPIVOT = 'SELECT '[email protected]+' 
      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 ('[email protected]+') 
      ) Result;' 

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

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