2016-04-22 24 views
0
declare @sql6 nvarchar(max) = '' 

set @sql6 = @sql6 + ' CODE' 

EXEC sp_executesql @SQL6 

Gibt es einen Fall, in dem das Deklarieren eines dynamischen SQL auf diese Weise abgeschnitten werden könnte?Dynamisches SQL wird abgeschnitten, obwohl es nvarchar (max) ist

Es ist eine Reihe von Code, nicht eine Wand aus Text einfügen möchten, aber die print-Anweisung endet mit:

GROUP BY 
    T1.TreatmentID, T1.SamplingRandomNumber, 
    T1.ProductID, T1.OptimizationGroupID, 
    T1.CurrencyCode, C.CalculatedFromText, 
    T1.TreatmentOrdinal, T1.SourceCode, 
    T1.[IsPriorBoo 

, wo es ein paar mehr sein sollte.

Der Fehler ist

falsche Syntax nahe ''.

Voll Code des jeweiligen Teils der Abfrage (in einer großen dynamischen Abfrage)

SELECT 
    T1.TreatmentID, 
    T1.SamplingRandomNumber, 
    T1.ProductID, 
    T1.OptimizationGroupID, 
    T1.CurrencyCode, 
    C.CalculatedFromText, 
    CONVERT(FLOAT,COUNT(1)) CountCalculatedFromText, 
    T1.TreatmentOrdinal, 
    Sum(T1.Revenue) AS Revenue, 
    T1.SourceCode 
    '+replace(@ColumnsPB,'t.','T1.') +' 
INTO 
    #RevenueDetailCount 
FROM 
    #RevenueDetailCountTmp T1 
INNER JOIN 
    #CalculatedFromText C ON T1.ProductID = C.ProductID 
          AND T1.OptimizationGroupID = C.OptimizationGroupID 
          AND T1.TreatmentOrdinal = C.TreatmentOrdinal 
          AND T1.SamplingRandomNumber = C.SamplingRandomNumber 
GROUP BY 
    T1.TreatmentID, 
    T1.SamplingRandomNumber, 
    T1.ProductID, 
    T1.OptimizationGroupID, 
    T1.CurrencyCode, 
    C.CalculatedFromText, 
    T1.TreatmentOrdinal, 
    T1.SourceCode 
    '+replace(@ColumnsPB,'t.','T1.') +' 

Edit: voll gedruckt dynamische SQL-

DECLARE @CalculatedFromText AS TABLE 
(
    CalculatedFromText varchar(100), 
    CalculatedFrom  smallint 
) 

INSERT INTO @CalculatedFromText 
( 
    CalculatedFromText, 
    CalculatedFrom 
) 
VALUES 
    ('Control' ,1), 
    ('Treatment' ,2), 
    ('Dynamic' ,3) 




select 
    TP.TreatmentID, 
    TP.ProductID, 
    TP.OptimizationGroupID, 
    MIN(TP.CalculatedFromText) AS CalculatedFromText, 
    TP.TreatmentOrdinal, 
    TP.SamplingRandomNumber, 
    TP.CurrencyCode, 
    TP.SourceCode 
    , TP.[IsPriorBooking] 
INTO #CalculatedFromText 
FROM #CalculatedFromTextTmp TP 
GROUP BY 
    TP.TreatmentID, 
    TP.ProductID, 
    TP.OptimizationGroupID, 
    TP.TreatmentOrdinal, 
    TP.SamplingRandomNumber,  
    TP.CurrencyCode , 
    TP.SourceCode 
    , TP.[IsPriorBooking] 



SELECT 
    SamplingRandomNumber, 
    TreatmentID, 
    CalculatedFromText, 
    ProductID, 
    OptimizationGroupID, 
    CONVERT(FLOAT,COUNT(1)) AS CountCalculatedFromText, 
    TreatmentOrdinal, 
    CurrencyCode, 

    SourceCode 
    , [IsPriorBooking] 
INTO #CountCalculatedFromText 
FROM #CalculatedFromText 
GROUP BY 
    SamplingRandomNumber, 
     TreatmentID, 
     CalculatedFromText, 
     ProductID, 
     OptimizationGroupID, 
     TreatmentOrdinal, 
     CurrencyCode, 
     SourceCode 
     , [IsPriorBooking] 
SELECT 
    SamplingRandomNumber, 
    TreatmentID, 
    ProductID, 
    OptimizationGroupID, 
    SUM(CountCalculatedFromText) AS AllCalculatedFromText, 
    CurrencyCode, 

    SourceCode 
    , [IsPriorBooking] 
INTO #AllCalculatedFromText 
FROM #CountCalculatedFromText AS cps2 
GROUP BY 
    SamplingRandomNumber, 
    TreatmentID, 
    ProductID, 
    OptimizationGroupID, 
    CurrencyCode, 
    SourceCode 
    , [IsPriorBooking] 


SELECT 
    CPS.SamplingRandomNumber, 
    CPS.TreatmentID, 
    CPS.CalculatedFromText, 
    CPS.TreatmentOrdinal, 
    CPS.ProductID, 
    CPS.OptimizationGroupID, 
    CPS.CountCalculatedFromText, 
    CPS.CountCalculatedFromText/T.AllCalculatedFromText AS PercentCalculatedFromText, 
    CPS.CurrencyCode, 
    CPS.SourceCode 
    , CPS.[IsPriorBooking] 
INTO #PercentCalculatedFromText 
FROM #CountCalculatedFromText AS CPS 
    INNER JOIN #AllCalculatedFromText T ON 
    T.TreatmentID=CPS.TreatmentID AND T.ProductID = CPS.ProductID 
     AND T.OptimizationGroupID = CPS.OptimizationGroupID 
     AND T.CurrencyCode = CPS.CurrencyCode 

SELECT 
    T.SamplingRandomNumber, 
    T.TreatmentID, 
    T.ProductID, 
    T.OptimizationGroupID, 
    T.TreatmentOrdinal, 
    T.CurrencyCode, 

    CASE WHEN T.CalculatedFromText = 2 THEN PS.CalculatedFromText + ' + CAST(T.TreatmentOrdinal AS char) 
     ELSE PS.CalculatedFromText END AS PricingType, 
    T.CalculatedFromText, 
    T.CountCalculatedFromText AS QuantityLooks, 
    T.PercentCalculatedFromText AS LooksPercentageOfTransactions, 
    T.SourceCode 
    , T.[IsPriorBooking] 
INTO #CountCalculatedFromTextPivot 
FROM #PercentCalculatedFromText T 
    INNER JOIN @CalculatedFromText AS PS ON T.CalculatedFromText = PS.CalculatedFrom 



SELECT 
    T1.TreatmentID, 
    T1.ProductID, 
    T1.GroupCode, 

    T1.OptimizationGroupID, 
    CASE WHEN T1.CalculatedFrom = 2 THEN T1.TreatmentOrdinal ELSE 0 END AS TreatmentOrdinal, 
    T1.CurrencyCode, 
    T1.SamplingRandomNumber, 
    T1.Revenue Revenue, 
    T1.SourceCode 
    , T1.[IsPriorBooking] 
INTO #RevenueDetailCountTmp 
FROM #TreatmentDetails T1 
WHERE T1.Stage=2 

SELECT 
    T1.TreatmentID, 
    T1.SamplingRandomNumber, 
    T1.ProductID, 
    T1.OptimizationGroupID, 
    T1.CurrencyCode, 

    C.CalculatedFromText, 
    CONVERT(FLOAT,COUNT(1)) CountCalculatedFromText, 
    T1.TreatmentOrdinal, 
    Sum(T1.Revenue) AS Revenue, 
    T1.SourceCode 
    , T1.[IsPriorBooking] 
INTO #RevenueDetailCount  
FROM #RevenueDetailCountTmp T1 
    INNER JOIN #CalculatedFromText C ON T1.ProductID = C.ProductID 
     AND T1.OptimizationGroupID = C.OptimizationGroupID 
     AND T1.TreatmentOrdinal = C.TreatmentOrdinal 
     AND T1.SamplingRandomNumber = C.SamplingRandomNumber 
GROUP BY 
    T1.TreatmentID, 
    T1.SamplingRandomNumber, 
    T1.ProductID, 
    T1.OptimizationGroupID, 
    T1.CurrencyCode, 
    C.CalculatedFromText, 
    T1.TreatmentOrdinal, 
    T1.SourceCode 
    , T1.[IsPriorBoo 
+0

I 'varchar glaube (max) 'ist immer noch bei 8000 Zeichen. Edit: Ich liege falsch - scheint es kann größer sein. –

+1

@SeanCoetzee: 'varchar (max)' hat eine Kapazität von ** 2 Milliarden ** Zeichen (und 'nvarchar (max)' hat die Hälfte, da jedes Zeichen 2 Bytes verwendet) –

+0

nvarchar (max) auch? Und ich habe irgendwo gelesen, solange ich es auf eine leere Zeichenkette lege und dann zu dieser Zeichenkette hinzufüge, sorgt es für eine max. –

Antwort

0

Sie haben wahrscheinlich zwei Probleme hier. Sie beziehen sich auf die PRINT-Anweisung - dies wird bei 8000 Bytes (4000 Zeichen, seit Sie nvarchar verwenden) stoppen. Wenn Sie die gesamte Abfrage in SSMS anzeigen möchten, können Sie sie am besten für die Ausgabe in XML umwandeln, wodurch Sie ein Feld erhalten, auf das Sie in SSMS klicken und das gesamte Objekt anzeigen können.

In der kurzen Bit der Abfrage sichtbar, Sie haben tatsächlich ein zusätzliches Angebot hier im ersten Teil Ihres DANN, die zumindest bricht, dass ein Teil der Anfrage:

CASE WHEN T.CalculatedFromText = 2 THEN PS.CalculatedFromText + ' + CAST(T.TreatmentOrdinal AS char) 
+0

ah macht Sinn, muss ich noch mehr testen. Vielen Dank –

Verwandte Themen