添加新的 Join 语句后 MS-SQL 存储过程引发错误。消息 102,级别 15,状态 1,第 279 行“WHERE”附近的语法不正确
Posted
技术标签:
【中文标题】添加新的 Join 语句后 MS-SQL 存储过程引发错误。消息 102,级别 15,状态 1,第 279 行“WHERE”附近的语法不正确【英文标题】:MS-SQL stored procedure throwing error after adding a new Join statement. Msg 102, Level 15, State 1, Line 279 Incorrect syntax near 'WHERE' 【发布时间】:2021-03-14 09:46:27 【问题描述】:错误:
消息 102,第 15 级,状态 1,第 279 行 'WHERE' 附近的语法不正确。
ALTER PROCEDURE [dbo].[Country_usp_GetLocationsDetailsTemp]
(@RiskID nvarchar(50)
,@LocationID nvarchar(50)
,@SortColumn nvarchar(50)
,@SortOrder nvarchar(5)
,@PageIndex nvarchar(5)
,@MaxRows nvarchar(5))
AS
declare @sql1 nvarchar(max)
declare @sql2 nvarchar(max)
BEGIN
SET NOCOUNT ON;
if( @SortColumn = 'Description') begin set @SortColumn = 'PL.Description' end
set @sql1 = '
;with LocationResults as
(
SELECT
ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ' ' + @SortOrder + ') AS RowNumber
,PL.RiskID as RiskID
, [LocationID]
,HMLC.Description as ''Country''
set @sql2 = ' ,EarthQuake as EarthQuakeID
,HRIF.ProgramID
FROM [Country_Locations] PL
LEFT OUTER JOIN Country_Master_Common HMLC on HMLC.ColumnName = ''Country'' and HMLC.Code = Country and HMLC.active = 1
LEFT OUTER JOIN Country_RiskInformation HRIF ON hrif.active = 1 and hrif.riskid = ''' + @RiskID + '''
WHERE
(''' + @RiskID + '''= '''' or PL.RiskID =''' + @RiskID + ''')
AND ('''+@LocationID+''' = '''' or LocationID = '''+@LocationID+''')
AND PL.Active = 1
)
SELECT * FROM LocationResults
WHERE
RowNumber BETWEEN('+@PageIndex+' -1) * '+@MaxRows + '+ 1 AND((('+@PageIndex+' -1) * '+@MaxRows+' + 1) + '+@MaxRows+') - 1'
exec (@sql1 + @sql2)
print @sql1
print @sql2
这是根据分页计算要显示的结果的公式。
这个公式在添加新的 Join 语句后就失效了。
但据我所知,我的加入没有问题,因为如果我尝试使用公式中的实际值执行打印的 SQL,例如:
SELECT * FROM LocationResults WHERE RowNumber BETWEEN 1 and 5
它工作正常。
注意:我在 SP 中使用的所有联接都是左外联接。
我想知道我哪里做错了。
【问题讨论】:
那个 SQL 无效。'+@PageIndex+' -1)
? '+@PageIndex+'
是一个文字字符串,如何从中减去 1
?这就像拥有'Apples' - 2
。
另外,WHERE
的位置不会产生该错误。我希望错误是 “将 varchar 值 '+@PageIndex+' 转换为数据类型 int 时转换失败。”
添加了重新生成错误的代码。请重新打开问题。
'+@pageIndex+' 将从后端代码接收实际值,实际上这种模式 '+@pageIndex+' 工作正常,如果我们从 sp LEFT OUTER JOIN Country_RiskInformation HRIF ON hrif 中删除以下连接语句.active = 1 和 hrif.riskid = ''' + @RiskID + '''
【参考方案1】:
由于代码过长,查询被截断。 添加一个新变量并将 sp 的最后一个查询分配给新变量解决了这个问题。
sql3= 'SELECT * FROM LocationResults WHERE RowNumber BETWEEN 1 和 5 '
【讨论】:
以上是关于添加新的 Join 语句后 MS-SQL 存储过程引发错误。消息 102,级别 15,状态 1,第 279 行“WHERE”附近的语法不正确的主要内容,如果未能解决你的问题,请参考以下文章
SQL语句中 LEFT JOIN 后 ON 和 WHERE 的区别
SQL语句中 LEFT JOIN 后 ON 和 WHERE 的区别