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