【问题标题】:SQL-Server Incorrect syntax in string querySQL-Server 字符串查询中的语法不正确
【发布时间】:2018-12-30 19:07:18
【问题描述】:

我正在尝试在 sql-server 中创建一个动态查询作为字符串,如果 @SupervisorId 或 @UnitId 为空,它会完美运行,但是当我像下面这样测试它时,我会收到此错误(意思是 @SupervisorId 或 @ UnitId 不为空):

消息 102,级别 15,状态 1,第 10 行 'c33fff6' 附近的语法不正确。 Msg 153, Level 15, State 2, Line 14 选项的无效使用 next 在 FETCH 语句中。消息 102,级别 15,状态 1,第 10 行不正确 'c33fff6' 附近的语法。

我尝试了什么:

declare @SupervisorId       uniqueidentifier = null;
declare @UnitId             uniqueidentifier = null;
declare @Name               nvarchar(max) = null;
declare @PersonTypeId       int;
declare @PageNum            int;
declare @PageSize           int;
declare @KW nvarchar(max);
declare @Query nvarchar(max);
declare @Query2 nvarchar(max);
declare @WhereClause nvarchar(max);

set @PageNum = 0;
set @PageSize = 50;
set @PersonTypeId = 10003;
set @UnitId = '5c33fff6-ae91-4946-92e2-50f8ae9bd6f5'; 

set @WhereClause = ' 1=1 ';
if (@Name is not null)
    set @WhereClause =@WhereClause + ' And p.Name like N'''+'%'+cast(@Name as nvarchar(4000))+'%'+''' or p.Family like N'''+'%'+cast(@Name as nvarchar(4000))+'%'+''' ';
if(@SupervisorId is not null)
    set @WhereClause = @WhereClause + ' AND p.SupervisorId in ('+ CAST(@SupervisorId as nvarchar(4000)) +') ';
if(@UnitId is not null)
    set @WhereClause = @WhereClause + ' AND p.UnitId in (' + CAST(@UnitId as nvarchar(4000)) + ') ';

    Set @Query = '
     SELECT u.*, p.*, uu.Name as UnitName, jj.Name as JobName, pp.Name + '' '' + pp.Family as SupervisorName, s.IsActive as IsActive
        FROM [Membership].Users u 
        LEFT JOIN [Membership].Persons p on p.ID = u.ID 
        INNER JOIN [kernel].BaseEntity s on s.ID = p.ID and s.IsDelete = 0
        LEFT JOIN Base.Units uu on uu.ID = p.UnitId
        LEFT JOIN Base.Jobs jj on jj.ID = p.JobId
        LEFT JOIN [Membership].Persons pp on pp.ID = p.SupervisorId

    Where '+@WhereClause+ ' and p.PersonTypeId = '+ CAST(@PersonTypeId as nvarchar(100)) +' 

    Order by p.Family DESC
    Offset '+CAST(@PageSize as nvarchar(10))+' * ('+CAST(@PageNum as nvarchar(10))+') Rows
    Fetch next '+CAST(@PageSize as nvarchar(10))+' ROWS ONLY';


    set @Query2 ='
     SELECT COUNT(*)
        FROM [Membership].Users u 
        LEFT JOIN [Membership].Persons p on p.ID = u.ID 
        INNER JOIN [kernel].BaseEntity s on s.ID = p.ID and s.IsDelete = 0
        LEFT JOIN Base.Units uu on uu.ID = p.UnitId
        LEFT JOIN Base.Jobs jj on jj.ID = p.JobId
        LEFT JOIN [Membership].Persons pp on pp.ID = p.SupervisorId

    Where '+@WhereClause + ' and p.PersonTypeId = '+ CAST(@PersonTypeId as nvarchar(100)) +'' ;

    exec (@Query);
    exec (@Query2); 

【问题讨论】:

  • 如果您打印 @query@query2 的值而不是/以及尝试执行它们,生成代码引起的“错别字”应该会跳转向您提出问题,而无需向 SO 发布问题。 (您可以将它们打印到控制台,或至少打印到适当日志级别的日志)
  • @Damien_The_Unbeliever 好像我没有尝试过那样,我知道有时你会陷入困境并且你的大脑会冻结。但谢谢。
  • 如果您尝试过,那么在您的问题中包含该输出对读者来说会好得多,而不是期望我们运行所有逻辑我们的头。在输出中发现错误,然后找出哪段原始代码产生了错误,这比反过来要容易得多。
  • @Damien_The_Unbeliever 你是对的。下一次。

标签: sql sql-server tsql


【解决方案1】:

您需要将值括在单引号中。这需要加倍报价。所以而不是:

set @WhereClause = @WhereClause + ' AND p.UnitId in (' + CAST(@UnitId as nvarchar(4000)) + ') ';

你需要:

set @WhereClause = @WhereClause + ' AND p.UnitId in (''' + CAST(@UnitId as nvarchar(4000)) + ''') ';

请注意,如果您实际上有多个值,则还需要将列表中的单引号加倍。

【讨论】:

  • 它可能是单个或多个,谢谢你让我检查一下,
  • 像魔术一样工作,谢谢 =) 但是我需要等待接受答案。
猜你喜欢
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多