【发布时间】: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