Запрос выполняется в Access, но генерирует ошибку в C # DataSet - PullRequest
1 голос
/ 19 декабря 2011

У меня есть этот запрос, whoch работает нормально, когда я тестирую его в Access, но я запускаю его из TSQL во внешней программе на C # (честно, я все еще изучаю термины, поэтому я думаю, TSQL является правильным для того, что я делаю (не было)). Когда я пытаюсь сохранить процедуру в табличном адаптере в моем XSD-файле, я получаю сообщение об ошибке (см. Ниже запрос). В результате правильная XML-схема не создается автоматически. В то время как запрос все еще выполняет , он также выдает ошибку. Я бы хотел, чтобы он работал без ошибок, но не могу понять, где на самом деле эта ошибка. Я попытался удалить все "=", заменив IIF на операторы CASE, но затем я получил другие ошибки (я могу опубликовать эту попытку, если это будет полезно)

SELECT  IIF(ISNULL(Owners.OwnFirstName), Owners.OwnLastName, 
         Owners.OwnFirstName + ' ' + Owners.OwnLastName) AS [Owner's Name], SUM(iif(UnitBarcodes.NephStatus = 'N', 1, 0)) 
         AS [Neph units], SUM(iif(UnitBarcodes.NephStatus = 'F', 1, 0)) AS [Filter units], COUNT(UnitBarcodes.NephStatus) 
         AS [Total Units]
FROM  (Owners INNER JOIN
         ((UnitBarcodes INNER JOIN
         AssembledUnits ON UnitBarcodes.ID = AssembledUnits.CaseID) INNER JOIN
         OwnerUnits ON AssembledUnits.ID = OwnerUnits.AssembledUnitID) ON Owners.ID = OwnerUnits.OwnerID)
GROUP BY IIF(ISNULL(Owners.OwnFirstName), Owners.OwnLastName, 
         Owners.OwnFirstName + ' ' + Owners.OwnLastName)

Сообщение об ошибке от Query Builder

Error in list of function arguments: '=' not recognized.
Unable to parse query text.

В любом случае, спасибо за помощь!

EDIT:

Это была моя предыдущая попытка заменить IIF на CASE

SELECT   (case when ISNULL(Owners.OwnFirstName) then Owners.OwnLastName else (Owners.OwnFirstName + ' ' + Owners.OwnLastName) end) AS [Owner's name],
          SUM(case where UnitBarcodes.NephStatus = 'N' then  1 else 0 end)) 
          AS [Neph units], SUM( case when UnitBarcodes.NephStatus = 'F' then 1 else 0 end)) AS [Filter units], COUNT(UnitBarcodes.NephStatus) 
          AS [Total units]
FROM         (Owners inner JOIN
          ((UnitBarcodes inner JOIN
          AssembledUnits ON UnitBarcodes.ID = AssembledUnits.CaseID) INNER JOIN
          OwnerUnits ON AssembledUnits.ID = OwnerUnits.AssembledUnitID) ON Owners.ID = OwnerUnits.OwnerID)
GROUP BY (case when ISNULL(Owners.OwnFirstName) then Owners.OwnLastName else (Owners.OwnFirstName + ' ' + Owners.OwnLastName) end) AS [Owner's name]

И я получаю ошибку

Error in list of function arguments: 'ISNULL' not recognized.
Error in list of function arguments: ')' not recognized.
Unable to parse query text.

EDIT2:

Так что этот запрос работает просто отлично

SELECT     IIF(ISNULL(Owners.OwnFirstName), Owners.OwnLastName, 
            Owners.OwnFirstName + ' ' + Owners.OwnLastName) AS [Owner's Name], COUNT(UnitBarcodes.NephStatus) 
            AS [Total units]
FROM         (Owners INNER JOIN
            ((UnitBarcodes INNER JOIN
            AssembledUnits ON UnitBarcodes.ID = AssembledUnits.CaseID) INNER JOIN
            OwnerUnits ON AssembledUnits.ID = OwnerUnits.AssembledUnitID) ON Owners.ID = OwnerUnits.OwnerID)
GROUP BY IIF(ISNULL(Owners.OwnFirstName), Owners.OwnLastName, 
            Owners.OwnFirstName + ' ' + Owners.OwnLastName)

Но как только я добавлю любую сумму (будь то через CASE или IIF), запрос выдаст ошибку.

Ответы [ 3 ]

1 голос
/ 19 декабря 2011

Вы можете использовать COALESCE для замены столбцов NULL пустой строкой и CASE для замены IIF в SUM.

SELECT  COALESCE(Owners.OwnFirstName + ' ','') + Owners.OwnLastName AS [Owner's Name],  
        SUM(CASE WHEN UnitBarcodes.NephStatus = 'N' THEN 1 ELSE 0 END) AS [Neph units], 
        SUM(CASE WEHN UnitBarcodes.NephStatus = 'F' THEN 1 ELSE 0 END) AS [Filter units], 
        COUNT(UnitBarcodes.NephStatus) AS [Total Units]
FROM  (Owners INNER JOIN
         ((UnitBarcodes INNER JOIN
         AssembledUnits ON UnitBarcodes.ID = AssembledUnits.CaseID) INNER JOIN
         OwnerUnits ON AssembledUnits.ID = OwnerUnits.AssembledUnitID) ON Owners.ID = OwnerUnits.OwnerID)
GROUP BY COALESCE(Owners.OwnFirstName + ' ','') + Owners.OwnLastName
0 голосов
/ 19 декабря 2011

Множество синтаксических ошибок.

Я отформатировал последнюю сделанную вами попытку и исправил некоторые ошибки.Надеюсь, что это работает для вас.

SELECT  case    when Owners.OwnFirstName IS NULL 
                then Owners.OwnLastName 
                else Owners.OwnFirstName + ' ' + Owners.OwnLastName 
        end AS [Owner's name]
        ,SUM(case when UnitBarcodes.NephStatus = 'N' then 1 else 0 end) AS [Neph units]
        ,SUM(case when UnitBarcodes.NephStatus = 'F' then 1 else 0 end) AS [Filter units]
        ,COUNT(UnitBarcodes.NephStatus) AS [Total units]
FROM    Owners 
JOIN    OwnerUnits
    ON  Owners.ID = OwnerUnits.OwnerID
JOIN    AssembledUnits
    ON  AssembledUnits.ID = OwnerUnits.AssembledUnitID
JOIN    UnitBarcodes 
    ON  UnitBarcodes.ID = AssembledUnits.CaseID
GROUP BY 
    case    when Owners.OwnFirstName IS NULL 
            then Owners.OwnLastName 
            else Owners.OwnFirstName + ' ' + Owners.OwnLastName 
    end
0 голосов
/ 19 декабря 2011

Вам необходимо преобразовать ваши операторы IIF в операторы CASE, IIF недопустим синтаксис T-SQL.

В ответ на ваш комментарий, в t-sql проверка не выполняется, вот пример:

CASE
     WHEN SomeValue IS NULL THEN
          SomeDefault
     ELSE
          SomeValue 

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...