SQL pivot query error: Unclosed quotation mark
SQL pivot query error: Unclosed quotation mark
我有 3 个表(1.Emp,2.OnLeave,3.DaysWeeks)。我正在尝试编写一个将 empname 和 calenderdates 显示为列的数据透视查询)
当我尝试 运行 数据透视查询时出现以下错误。
1.Unclosed 字符串'2016-12-31])) as pvt'后的引号。
2.Incorrect syntax near '2016-12-31])) as pvt'
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME([CalDate])
FROM DaysWeeks
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SELECT @query =
'WITH cte AS (
SELECT EmpDays.Employee,EmpDays.CalDate, ISNULL(v.VacationType,1) AS LeaveStatus
FROM dbo.OnLeave v
RIGHT OUTER JOIN
(SELECT e.EmpID AS Employee, dw.CalDate AS CalDate, dw.DayOfWeekName AS DoWName
FROM daysweeks dw,
dbo.Emp e
WHERE dw.CalYear = 2016 AND dw.monthnumber=1) AS EmpDays
ON
v.EmpID = EmpDays.Employee
AND v.StartingDate <= empdays.CalDate
AND v.EndingDate >= empdays.CalDate
)
SELECT * FROM cte PIVOT
(Max(cte.LeaveStatus) FOR cte.CalDate in([' + @cols + '])) as pvt'
EXEC SP_EXECUTESQL @query
因为 QUOTENAME
已经添加到这里
STUFF((SELECT ',' + QUOTENAME([CalDate])
这里不需要 [
和 ]
,
FOR cte.CalDate in([' + @cols + '])) as pvt'
这是错误的。它将使整个数据透视列列表被视为单列
改为
FOR cte.CalDate in(' + @cols + ')) as pvt'
更新: 通过传递 deptId
值(@deptId as smallint =1)来过滤记录。像这样更改您的查询
Declare @deptId SMALLINT = 1
......
RIGHT OUTER JOIN
(SELECT e.EmpID AS Employee, dw.CalDate AS CalDate, dw.DayOfWeekName AS DoWName
FROM daysweeks dw,
dbo.Emp e
WHERE dw.CalYear = 2016
AND dw.monthnumber=1
AND e.deptId = @deptId ) AS EmpDays
......
EXEC SP_EXECUTESQL @query,N'@deptId SAMLLINT',@deptId = @deptId
我有 3 个表(1.Emp,2.OnLeave,3.DaysWeeks)。我正在尝试编写一个将 empname 和 calenderdates 显示为列的数据透视查询)
当我尝试 运行 数据透视查询时出现以下错误。
1.Unclosed 字符串'2016-12-31])) as pvt'后的引号。
2.Incorrect syntax near '2016-12-31])) as pvt'
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME([CalDate])
FROM DaysWeeks
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SELECT @query =
'WITH cte AS (
SELECT EmpDays.Employee,EmpDays.CalDate, ISNULL(v.VacationType,1) AS LeaveStatus
FROM dbo.OnLeave v
RIGHT OUTER JOIN
(SELECT e.EmpID AS Employee, dw.CalDate AS CalDate, dw.DayOfWeekName AS DoWName
FROM daysweeks dw,
dbo.Emp e
WHERE dw.CalYear = 2016 AND dw.monthnumber=1) AS EmpDays
ON
v.EmpID = EmpDays.Employee
AND v.StartingDate <= empdays.CalDate
AND v.EndingDate >= empdays.CalDate
)
SELECT * FROM cte PIVOT
(Max(cte.LeaveStatus) FOR cte.CalDate in([' + @cols + '])) as pvt'
EXEC SP_EXECUTESQL @query
因为 QUOTENAME
已经添加到这里
STUFF((SELECT ',' + QUOTENAME([CalDate])
这里不需要 [
和 ]
,
FOR cte.CalDate in([' + @cols + '])) as pvt'
这是错误的。它将使整个数据透视列列表被视为单列
改为
FOR cte.CalDate in(' + @cols + ')) as pvt'
更新: 通过传递 deptId
值(@deptId as smallint =1)来过滤记录。像这样更改您的查询
Declare @deptId SMALLINT = 1
......
RIGHT OUTER JOIN
(SELECT e.EmpID AS Employee, dw.CalDate AS CalDate, dw.DayOfWeekName AS DoWName
FROM daysweeks dw,
dbo.Emp e
WHERE dw.CalYear = 2016
AND dw.monthnumber=1
AND e.deptId = @deptId ) AS EmpDays
......
EXEC SP_EXECUTESQL @query,N'@deptId SAMLLINT',@deptId = @deptId