2015-01-26 1 views
0

У меня динамическая инструкция sql, и я считаю, что она будет работать с проблемой, которую я имею, когда создаю процедуру, в которой оператор выбора имеет проблему с '' Quote ''.Динамическая ошибка строки SQL при выборе оператора

Вот моя процедура.

CREATE PROCEDURE GetPanelData(@FirstYear int = null, @SecondYear int = null, @ThirdYear int = null, @CompanySelected int = null) 
AS 
SET NOCOUNT ON; 
DECLARE @SQL NVARCHAR(4000); 
DECLARE @ParameterDefinition NVARCHAR(4000); 

SELECT @ParameterDefinition = '@Year1 int, 
           @Year2 int, 
           @Year3 int, 
           @companyID int'; 

SELECT @SQL = N' 
    SELECT FirstColumn.Type, 
      FirstColumn.YearPanelCount, 
      SecondColumn.YearPanelCount 

    FROM 
    (SELECT ''Quote'' AS Type, sum(mdl.Panel) AS YearPanelCount 
    FROM Model mdl, Quote QT, Quote_Line_Items QLT, Products Prd 
    WHERE QT.QuoteID = QLT.QuoteID AND 
     QLT.ProductID = Prd.ProductID AND 
     Prd.ModelID = mdl.ModelID AND 
     DATEPART(YYYY, QT.Quote_Date) = @Year1 AND 
     Prd.CompanyID = @companyID) AS FirstColumn 
'; 

IF @SecondYear IS NOT NULL 
    SELECT @SQL = @SQL + N' 
    inner join(
    SELECT ''Quote'' AS Type, sum(mdl.Panel) AS YearPanelCount 
    FROM Model mdl, Quote QT, Quote_Line_Items QLT, Products Prd 
    WHERE QT.QuoteID = QLT.QuoteID AND 
     QLT.ProductID = Prd.ProductID AND 
     Prd.ModelID = mdl.ModelID AND 
     DATEPART(YYYY, QT.Quote_Date) = @Year2 AND 
     Prd.CompanyID = @companyID) AS SecondColumn 
    on FirstColumn.Type = SecondColumn.Type 
'; 

IF @ThirdYear IS NOT NULL 
    SELECT @SQL = @SQL + N' 
    inner join(
    (SELECT ''Quote'' AS Type, sum(mdl.Panel) AS YearPanelCount 
    FROM Model mdl, Quote QT, Quote_Line_Items QLT, Products Prd 
    WHERE QT.QuoteID = QLT.QuoteID AND 
     QLT.ProductID = Prd.ProductID AND 
     Prd.ModelID = mdl.ModelID AND 
     DATEPART(YYYY, QT.Quote_Date) = @Year3 AND 
     Prd.CompanyID = @companyID)) AS ThirdColumn 
    on FirstColumn.Type = ThirdColumn.Type 
    '; 

EXEC sp_executeSQL @SQL, 
    @ParameterDefinition, 
    @Year1 = @FirstYear, 
    @Year2 = @SecondYear, 
    @Year3 = @ThirdYear, 
    @CompanyID = @CompanySelected; 
GO 

EXEC GetPanelData @FirstYear = 2012, @SecondYear = 2013, @CompanySelected = '1'; 

Кто-нибудь знает, почему я получаю эту ошибку, когда запускаю ее. Msg 102, Level 15, State 1, Line 27 Неправильный синтаксис рядом с полем «Цитата».

Когда я запускаю запрос SELECT 'Quote', sum (mdl.Panel) работает, но по какой-то причине в этом случае он не может.

+0

Показать фактическую сгенерированную котировку. «Строка 27» бесполезна, не видя, что такое конечный продукт. –

+0

показать значение @SQL перед этой строкой EXEC sp_executeSQL – HaveNoDisplayName

+0

Буквально просто хочу, чтобы это отображалось как | ТИП | YearPanelCount | | Цитировать | 1029 (напр.) | Невозможно ли просто выбрать статическое значение в качестве первого выбора? –

ответ

0

Я вижу два вопроса. Во-первых, заключительная цитата для всего вашего запроса обусловлена ​​параметром @ThirdYear, который является нулевым для вашего исполнения, оставляя вас с закрытой круглой скобкой. Первая открытая скобка кажется ненужным, поэтому я хотел бы изменить

SELECT @SQL = N' 
(SELECT FirstColumn.Type,... 

в

SELECT @SQL = N' 
SELECT FirstColumn.Type,... 

Если вы хотите, чтобы ваш запрос быть заключен в круглые скобки, вы должны переместить закрытую скобку к окончательному set после параметризованных устанавливает:

SET @SQL = @SQL + ')' 

Второй вопрос, который я вижу, что я думаю, что будет бросать другую ошибку, как только вы исправить первый вопрос, является то, что вы пытаетесь джо в именах столбцов Quote которые не существуют. Возможно, вы хотели присоединиться к имени столбца Type?

+0

Спасибо за ввод. Я понял проблему, я уже обновил свой код раньше. Я не видел, что вы прокомментировали, но это были два решения. –

+0

Нет проблем, в любое время. –

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

  • Нет связанных вопросов^_^