动态sql游标

动态sql游标,sql,sql-server,sql-server-2008,tsql,dynamic-sql,Sql,Sql Server,Sql Server 2008,Tsql,Dynamic Sql,运行以下查询时,“.”附近的语法不正确 DECLARE @StaffID INT = 4, @Cursorsql nvarchar(4000); SET @Cursorsql = 'DECLARE curStaff CURSOR FOR '; SET @Cursorsql = @Cursorsql + ' SELECT s.StaffID, o.OfficeName, s.FirstName '; SET @Cursorsql = @Cursorsql + ' ' + 's.LastN

运行以下查询时,“.”附近的语法不正确

DECLARE 
@StaffID INT = 4,
@Cursorsql nvarchar(4000);  

SET @Cursorsql = 'DECLARE curStaff CURSOR FOR ';
SET @Cursorsql = @Cursorsql + ' SELECT s.StaffID, o.OfficeName, s.FirstName '; 
SET @Cursorsql = @Cursorsql + ' ' + 's.LastName FROM Staff s  '; 
SET @Cursorsql = @Cursorsql + ' INNER JOIN Offices o ON o.OfficeID = s.OfficeID '; 
SET @Cursorsql = @Cursorsql + ' WHERE (s.OfficeID = @OfficeID OR @OfficeID = 0) '; 
IF @StaffID > 0 
 SET @Cursorsql = @Cursorsql + ' AND s.StaffID = @StaffID '; 
SET @Cursorsql = @Cursorsql + ' ORDER BY s.OfficeID, s.FirstName, s.LastName ';  

exec (@Cursorsql);
您在s.FirstName之后漏掉了一个逗号:


打印动态sql并检查语法错误始终是一个好主意,也是一种简单的故障排除方法。选择列表中的s.FirstName和s.LastName之间缺少逗号

试试这个-

DECLARE 
@StaffID INT = 4,
@Cursorsql nvarchar(4000);  

SET @Cursorsql = 'DECLARE curStaff CURSOR FOR ';
SET @Cursorsql = @Cursorsql + ' SELECT s.StaffID, o.OfficeName, s.FirstName, '; 
SET @Cursorsql = @Cursorsql + ' s.LastName FROM Staff s  '; 
SET @Cursorsql = @Cursorsql + ' INNER JOIN Offices o ON o.OfficeID = s.OfficeID '; 
SET @Cursorsql = @Cursorsql + ' WHERE (s.OfficeID = @OfficeID OR @OfficeID = 0) '; 
IF @StaffID > 0 
 SET @Cursorsql = @Cursorsql + ' AND s.StaffID = @StaffID '; 
SET @Cursorsql = @Cursorsql + ' ORDER BY s.OfficeID, s.FirstName, s.LastName ';  
sp_executesql @CursorSql, N'@StaffID int', @StaffID;

不相关,但不能将exec@CursorSql与参数一起使用。您需要使用sp_executesql@CursorSql,N'@StaffID int',@staffidy您正在执行动态SQL,但仍然将参数设置为可选或@OfficeID=0?请注意,SQL Server不喜欢未正确优化的此类查询。你最好在必要时删除/添加条件。
DECLARE 
@StaffID INT = 4,
@Cursorsql nvarchar(4000);  

SET @Cursorsql = 'DECLARE curStaff CURSOR FOR ';
SET @Cursorsql = @Cursorsql + ' SELECT s.StaffID, o.OfficeName, s.FirstName, '; 
SET @Cursorsql = @Cursorsql + ' s.LastName FROM Staff s  '; 
SET @Cursorsql = @Cursorsql + ' INNER JOIN Offices o ON o.OfficeID = s.OfficeID '; 
SET @Cursorsql = @Cursorsql + ' WHERE (s.OfficeID = @OfficeID OR @OfficeID = 0) '; 
IF @StaffID > 0 
 SET @Cursorsql = @Cursorsql + ' AND s.StaffID = @StaffID '; 
SET @Cursorsql = @Cursorsql + ' ORDER BY s.OfficeID, s.FirstName, s.LastName ';  
sp_executesql @CursorSql, N'@StaffID int', @StaffID;