添加新的 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 用于空白MS-SQL(T-SQL)存储过程的模板。

Join 语句

SQL语句中 LEFT JOIN 后 ON 和 WHERE 的区别

SQL语句中 LEFT JOIN 后 ON 和 WHERE 的区别

c# Linq select join on select group by

MS-SQL 中是不是有等效于 SHA1() 的方法?