【问题标题】:Incorrect syntax near '1': STUFF and QUERY'1' 附近的语法不正确:STUFF 和 QUERY
【发布时间】:2014-07-09 17:12:12
【问题描述】:

以下是我的代码,我得到“1 附近的语法不正确”,1 是 SELECT @cols 语句中的那个。谁能告诉我错误是什么?

ALTER PROCEDURE OnCall_Report 
(
    @FromDate datetime,
    @ToDate datetime,
    @SID varchar(10)
)

AS
BEGIN

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query  AS NVARCHAR(MAX)


SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(CategoryName)from OnCall_Category FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
            ,1,1,'');


SELECT @query=' 
        SELECT 
                EmployeeSID,
                ManagerSID

            FROM
                (
                SELECT EmployeeSID, 
                       ManagerSID,
                       IsAllowance*10+AllowanceCategory as Category,
                       Count(RequestID)as RequestCount   

                FROM 
                       OnCall_Request 

                WHERE 
                        EmployeeSID='+@SID+' and 
                        RequestDate BETWEEN '+convert(varchar(200),@FromDate)+' AND '+convert(varchar(200),@ToDate)+' 

                GROUP BY 
                         EmployeeSID,
                         ManagerSID,
                         IsAllowance,
                         AllowanceCategory
            )

            PIVOT (
                     Min(RequestCount) 
                     FOR Category IN ('+@cols+') 
                   ) AS t2'
Execute(@query) 
END
GO

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您的问题出在where 子句中。

    WHERE 
        EmployeeSID='+@SID+' and 
        RequestDate BETWEEN '+convert(varchar(200),@FromDate)+' AND '+convert(varchar (200),@ToDate)+' 
    

    EmployeeSID 是一个字符串,所以需要加引号,而日期是日期,所以同样如此。

    使用sp_executesql 并将这些值作为参数传递给动态 SQL 会更好,也更安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2013-12-16
      • 1970-01-01
      • 2018-08-14
      • 2011-03-11
      • 2014-02-16
      • 2017-01-11
      相关资源
      最近更新 更多