【问题标题】:Dynamic SQL string error in selecting statement选择语句中的动态 SQL 字符串错误
【发布时间】:2015-03-25 05:41:44
【问题描述】:

我有一个动态 sql 语句,我相信它会起作用我遇到的问题是,当我创建过程时,select 语句的“引用”有问题。

这是我的程序。

    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';

有谁知道为什么我运行它时会出现此错误。 消息 102,第 15 层,状态 1,第 27 行 “引用”附近的语法不正确。

当我运行查询 SELECT 'Quote', sum(mdl.Panel) 时它可以工作,但由于某种原因在这种情况下它不能。

【问题讨论】:

  • 显示实际生成的报价。 Line 27 不知道最终产品是什么,是没用的。
  • 在此行 EXEC sp_executeSQL 之前显示@SQL 的值
  • 从字面上看,我只是希望它显示为 |类型 |年面板计数 | |报价 | 1029(计数)|不能只选择一个静态值作为首选吗?
  • 第一个 ( 是否有对应的 )
  • rene 是个好地方,但现在它说 Quote 是一个无效的列名。这对我来说没有意义,因为它在单个 select 语句中工作,并且列名应该是 Type

标签: sql stored-procedures dynamic-sql


【解决方案1】:

我看到两个问题。第一个是整个查询的结束引号以@ThirdYear 参数为条件,该参数在您执行时为空,留下一个未闭合的括号。第一个左括号似乎没有必要,所以我会改变

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

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

如果您希望将查询括在括号中,则应将右括号移至参数化集之后的最后一个 set

SET @SQL = @SQL + ')'

我看到的第二个问题,我认为一旦你解决了第一个问题,就会引发另一个错误,即你试图加入不存在的列名Quote。也许您打算加入列名Type

【讨论】:

  • 感谢您的输入我发现了问题我之前已经更新了我的代码我没有看到您发表了评论,但这是两个解决方案。
  • 没问题,随时都可以。
猜你喜欢
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多