1

У меня есть этот SQL-запрос в типизированном наборе данных в asp.net 2005 и SQL Server 2008 R2. i.e Я использовал в Typed Dataset - «Добавить запрос» - «Использовать Sql-выражения» и использовал приведенный ниже скрипт, после чего я вернул Datatable. («Заполнить Datatable» флажок был снят ")Sql Query in Typed Dataset, вызывающий ошибку Parser

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 

Но щелкать дальше, это вызывает ошибку вроде этого:.

Ошибка в ИНЕКЕ вблизи„(“
Невозможно синтаксический анализ текста запроса.

Однако если я запускаю же выше запрос в SQL Server 2008 R2 Management Studio, он прекрасно работает и возвращает результаты.

Пожалуйста, предложите, что я делаю неправильно.

Благодаря


Привет, я использовал один выход для this..ie использовал этот запрос (после небольшой модификации) в качестве встроенного запроса в .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 [email protected] AND [email protected] 
    for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '')) 

    RETURN @List; 

END

+0

Есть ли у вас пробовал без парантезиса? например, где Messages.MessageTypeID = 1 и Projects.ProjectID <> '0' – Kuzgun

+0

Я отредактировал оригинальный запрос, поэтому, пожалуйста, просмотрите и предложите – vicky

ответ

0

Есть слишком много присоединяется я считаю. Например, запрос ниже

(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, 

получает только ПгвЬЫат и ФАМИЛИЮ, клетку, он не должен быть запрос с соединением. Кроме того, вы уже присоединились к таблице проектов в конце. Вы можете дать псевдоним внешнего запроса и сделать внутренние запросы проще:

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 

Наконец, если вы не получить никакой информации из таблицы Customers, вы можете пропустить следующую строку:

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

@ Kuzgun ... спасибо ... Я пробую ваше предложение .. – vicky