动态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;