2015-12-17 2 views
0

Если я заканчиваю мой запрос с этим:Пытаясь понять динамический синтаксис SQL более

+'SELECT 
    CPS.CalculatedFromText, 
    CPS.TreatmentOrdinal, 
    CPS.ProductID, 
    CPS.OptimizationGroupID, 
    CPS.CountCalculatedFromText, 
    CPS.CountCalculatedFromText/T.AllCalculatedFromText AS PercentCalculatedFromText, 
    CPS.CurrencyCode, 
    CPS.Origin, 
    CPS.Destination,'+ 
    case when @passangers='Y' then 'CPS.Passangersgroup' 
    when @fareclass='Y' then 'CPS.Fareclass' 
    when @ispriorbooking='Y' then 'CPS.IsPriorBooking' 
    else '' end +' 
INTO ##PercentCalculatedFromText 
FROM ##CountCalculatedFromText AS CPS 
    INNER JOIN ##AllCalculatedFromText T ON T.ProductID = CPS.ProductID 
     AND T.OptimizationGroupID = CPS.OptimizationGroupID 
     AND T.CurrencyCode = CPS.CurrencyCode 
     AND T.Origin=CPS.Origin 
     AND T.Destination=CPS.Destination,'+ 
    case when @passangers='Y' then ' AND T.Passangersgroup=CPS.Passangersgroup' 
    when @fareclass='Y' then 'AND T.Fareclass=CPS.Fareclass' 
    when @ispriorbooking='Y' then 'AND T.IsPriorBooking=CPS.IsPriorBooking' 
    else '' end 

exec (@SQL2) 

он не работает, приходит с неправильным синтаксисом рядом ". но это:

+' SELECT 
    ProductID, 
    OptimizationGroupID, 
    SUM(CountCalculatedFromText) AS AllCalculatedFromText, 
    CurrencyCode, 
    Origin, 
    Destination,'+ 
    case when @passangers='Y' then 'Passangersgroup' 
    when @fareclass='Y' then 'Fareclass' 
    when @ispriorbooking='Y' then 'IsPriorBooking' 
    else '' end +' 
INTO ##AllCalculatedFromText 
FROM ##CountCalculatedFromText AS cps2 
GROUP BY ProductID, 
    OptimizationGroupID, 
    CurrencyCode, 
    Origin, 
    Destination,'+ 
    case when @passangers='Y' then 'Passangersgroup' 
    when @fareclass='Y' then 'Fareclass' 
    when @ispriorbooking='Y' then 'IsPriorBooking' 
    else '' 
end 
exec (@SQL2) 

РАБОТАЛ (все, что я сделал, было двигаться EXEC заявление выше первого набора кода)

Я не понимая, как я получаю что-то здесь не так.

Другие вопросы: можете ли вы запустить инструкцию exec, если динамический код sql заканчивается символом '?

Что вы делаете, когда вы могли бы закончить с чем-то вроде:

case when @passangers='Y' then 'Passangersgroup' 
    when @fareclass='Y' then 'Fareclass' 
    when @ispriorbooking='Y' then 'IsPriorBooking' 
    else '' 
+ 
'variable X' 

SQL SERVER 2014

+0

Какова длина переменной @ SQL2? Может быть, сгенерированный оператор усекается при назначении переменной. – Nathan

+0

declare @ SQL2 varchar (max) –

ответ

0

У вас есть дополнительные comma в Join состоянии в первом запросе

........ 
'INNER JOIN ##AllCalculatedFromText T ON T.ProductID = CPS.ProductID 
     AND T.OptimizationGroupID = CPS.OptimizationGroupID 
     AND T.CurrencyCode = CPS.CurrencyCode 
     AND T.Origin=CPS.Origin 
     AND T.Destination=CPS.Destination' + --here 
case when @passangers='Y' then ' AND T.Passangersgroup=CPS.Passangersgroup' 
......... 
+0

да, я забыл снять это, когда отправил его. Это странно, так как даже если я просто положить + 'SELECT \t CPS.CalculatedFromText \t INTO ## PercentCalculatedFromText С ## CountCalculatedFromText AS CPS' Exec (@ SQL2) \t он не работает .. я объявляю SQL2 объявить @ SQL2 VARCHAR (max) –

+0

Вам нужно показать, что вы добавляете до '+ 'SELECT CPS.CalculatedFro..' –

0

вы также получил пробел в начале строки во втором случае. Это может серьезно изменить то, что происходит в зависимости от того, как строка добавляется к концу. Если он заканчивается новой строкой, это не будет иметь никакого значения, но если он заканчивается последним символом предыдущей команды или «END», вы получите «ENDSELECT» против «END SELECT», который будет ведут себя по-разному.

+0

а? где? на случай, когда @ пассажиров = 'Y', то 'Passangersgroup' когда @ fareclass = 'Y', то 'Fareclass' когда @ ispriorbooking = 'Y', то 'IsPriorBooking' еще '' + 'переменная X' –

+0

Right в начале перед SELECT, но у вас есть одна и та же проблема в этой части: переменная X не будет разделена пробелом от части запроса до этого. В этой части кавычки являются частью синтаксиса для построения строки, а не части строки или части того, что actall запускает exec. – James

+0

Вы должны напечатать строку, прежде чем выполнять ее при отладке, чтобы вы могли видеть простые ошибки пробела и пунктуации, подобные тем, которые у вас есть. – James

Смежные вопросы