【问题标题】:Sql Query in Typed Dataset causing Parser Error类型化数据集中的 Sql 查询导致解析器错误
【发布时间】:2014-01-20 11:13:42
【问题描述】:

我在 asp.net 2005 和 SQL Server 2008 R2 的类型化数据集中有这个 SQL 查询。 即我在类型化数据集中使用过——“添加查询”——“使用 Sql 语句”并使用了下面的脚本,然后我返回了一个数据表。 (“填写数据表”复选框未选中“)

SELECT DISTINCT
ISNULL(Projects.ProjectID,'0') as 
ProjectID,Messages.MessageID, Projects.ProjectName, Customers.CustomerName as 
CustomerName, Regions.RegionName,
(select U.firstName + ' ' + U.LastName 
 from Users U inner join Projects P on P.ProjectManagerId = U.UserID inner join   
 Messages M on M.ProjectId = P.ProjectID
 where M.MessageID =  Messages.MessageID) as ProjectManagerName,
 dbo.phases.TagName as Phase,
(select U.firstName + ' ' + U.LastName 
from Users U inner join  Messages M on M.CreatedBy = U.UserID Where M.MessageID =   
Messages.MessageID) as CreatedBy,
Messages.DateCreated as EmailCreatedDate,
Messages.MessageSubject as MessageSubject,
Users.Email as [From],
**(stuff((select ','+U.EMAIL
FROM USERS U INNER JOIN Recipients R ON U.USERID = R.USERID INNER JOIN MESSAGES M   
ON  R.MESSAGEID = M.MESSAGEID
          WHERE m.MessageID=Messages.MessageID AND R.RecipientTypeID=1
          for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '')) as [TO],**

  **(stuff((select ','+U.EMAIL 
          FROM USERS U INNER JOIN Recipients R ON U.USERID = R.USERID INNER JOIN    
MESSAGES M ON R.MESSAGEID = M.MESSAGEID
          WHERE m.MessageID=Messages.MessageID AND R.RecipientTypeID=2
          for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '')) as CC** 


FROM     Messages INNER JOIN  Users 
              ON Messages.Sender = Users.UserID
              INNER JOIN Recipients
              ON Messages.MessageID = Recipients.MessageID
              LEFT OUTER JOIN dbo.Projects 
              ON dbo.Messages.ProjectID = dbo.Projects.ProjectID                      
              Left OUTER JOIN dbo.Customers on dbo.Projects.CustomerId =  
dbo.Customers.CustomerID 
              Left outer join dbo.regions on dbo.Customers.RegionID =  
dbo.Regions.RegionID
              left outer join dbo.Phases on messages.phaseid = dbo.phases.phaseid

where (Messages.MessageTypeID=1)
and Projects.ProjectID <> '0' 
order by Projects.ProjectName

但是在点击 next 时,它会导致如下错误:

'(' 附近的 WHERE 子句出错。
无法解析查询文本。

但是,如果我在 SQL Server 2008 R2 Management Studio 中运行上述相同的查询,它会运行良好并返回结果。

请提出我做错了什么。

谢谢


嗨,我为此使用了一种方法..即使用此查询(经过轻微修改)作为文件后面的 .cs 代码中的内联查询..但现在出现了另一个问题....即。 现在返回结果花费了太多时间。是因为我在查询中使用的函数吗?请为此提出一些解决方法..

 SELECT DISTINCT
   ISNULL(Projects.ProjectID,'0') as 
   ProjectID,Messages.MessageID, Projects.ProjectName, Customers.CustomerName as  CustomerName, Regions.RegionName,  
   (select U.firstName + ' ' + U.LastName 
     from Users U inner join Projects P on P.ProjectManagerId = U.UserID inner join Messages M on M.ProjectId = P.ProjectID
     where M.MessageID =  Messages.MessageID) as ProjectManagerName,
     dbo.phases.TagName as Phase,
     (select U.firstName + ' ' + U.LastName 
     from Users U inner join  Messages M on M.CreatedBy = U.UserID Where M.MessageID = Messages.MessageID) as CreatedBy,
     Messages.DateCreated as EmailCreatedDate,
     Messages.MessageSubject as MessageSubject,
     Users.Email as [From],

    (select [dbo].[fn_ForEmailReport](Messages.MessageID,1)) as [TO],
    (select [dbo].[fn_ForEmailReport](Messages.MessageID,2)) as [CC]

    FROM     Messages INNER JOIN  Users 
                      ON Messages.Sender = Users.UserID
                      INNER JOIN Recipients
                      ON Messages.MessageID = Recipients.MessageID
                      LEFT OUTER JOIN dbo.Projects 
                      ON dbo.Messages.ProjectID = dbo.Projects.ProjectID                      
                      Left OUTER JOIN dbo.Customers on dbo.Projects.CustomerId = dbo.Customers.CustomerID 
                      Left outer join dbo.regions on dbo.Customers.RegionID = dbo.Regions.RegionID
                      left outer join dbo.Phases on messages.phaseid = dbo.phases.phaseid

    where (Messages.MessageTypeID=1)
    and Projects.ProjectID <> '0' 
    order by Projects.ProjectName


-- FUNCTION "fn_ForEmailReport" used in above query.

ALTER FUNCTION [dbo].[fn_ForEmailReport]
(
    @MessageID int,
    @RecipientTypeID int
)
RETURNS NVARCHAR(MAX)        
AS
BEGIN
    DECLARE @List VARCHAR(8000)
    set @List = (stuff((select ','+U.EMAIL 
    FROM USERS U inner JOIN Recipients R ON R.USERID = U.USERID inner JOIN 
            MESSAGES M ON R.MESSAGEID = M.MESSAGEID
    WHERE m.MessageID=@MessageID AND R.RecipientTypeID=@RecipientTypeID
    for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, ''))

  RETURN @List;

结束

【问题讨论】:

  • 你试过不带括号吗?比如 Messages.MessageTypeID=1 和 Projects.ProjectID '0'
  • 我编辑了原始查询,请查看并提出建议

标签: asp.net sql sql-server-2008-r2 syntax-error strongly-typed-dataset


【解决方案1】:

我相信有太多的连接。比如下面的查询

(select U.firstName + ' ' + U.LastName 
from Users U inner join Projects P 
on P.ProjectManagerId = U.UserID 
inner join Messages M on M.ProjectId = P.ProjectID
where M.MessageID =  Messages.MessageID) as ProjectManagerName,

只得到一个名字和姓氏,一个单元格,它不需要是一个连接查询。另外,您已经在最后加入了 Projects 表。你可以给外部查询一个别名,让内部查询更简单:

SELECT DISTINCT
   ISNULL(Projects.ProjectID,'0') as 
   ProjectID,Messages.MessageID, Projects.ProjectName, Customers.CustomerName as  CustomerName, Regions.RegionName,  
   (select U.firstName + ' ' + U.LastName 
     from Users WHERE P.ProjectManagerId = UserID) as ProjectManagerName,
     dbo.phases.TagName as Phase,
     (select U.firstName + ' ' + U.LastName 
     from Users WHERE M.CreatedBy = UserID) as CreatedBy,
     Messages.DateCreated as EmailCreatedDate,
     Messages.MessageSubject as MessageSubject,
     Users.Email as [From],

    (select [dbo].[fn_ForEmailReport](Messages.MessageID,1)) as [TO],
    (select [dbo].[fn_ForEmailReport](Messages.MessageID,2)) as [CC]

    FROM     Messages M INNER JOIN  Users 
                      ON Messages.Sender = Users.UserID
                      INNER JOIN Recipients
                      ON Messages.MessageID = Recipients.MessageID
                      LEFT OUTER JOIN dbo.Projects P
                      ON dbo.Messages.ProjectID = dbo.Projects.ProjectID                      
                      Left OUTER JOIN dbo.Customers on dbo.Projects.CustomerId = dbo.Customers.CustomerID 
                      Left outer join dbo.regions on dbo.Customers.RegionID = dbo.Regions.RegionID
                      left outer join dbo.Phases on messages.phaseid = dbo.phases.phaseid

    where (Messages.MessageTypeID=1)
    and Projects.ProjectID <> '0' 
    order by Projects.ProjectName

最后,如果您没有从客户表中检索任何信息,您可以省略以下行:

Left OUTER JOIN dbo.Customers on dbo.Projects.CustomerId = dbo.Customers.CustomerID 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多