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
I 'varchar glaube (max) 'ist immer noch bei 8000 Zeichen. Edit: Ich liege falsch - scheint es kann größer sein. –
@SeanCoetzee: 'varchar (max)' hat eine Kapazität von ** 2 Milliarden ** Zeichen (und 'nvarchar (max)' hat die Hälfte, da jedes Zeichen 2 Bytes verwendet) –
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. –