2011-12-19 4 views
1

Accessでテストしたときにwhochがうまく動作しますが、実行中ですが、TSQLのC#プログラムで (正直なところ、条件を学ぶので、TSQLは私がやっていることに対して正しいと思います(そうではありませんでした)。 XSDファイルのtableadapterにプロシージャを格納しようとすると、エラーが発生します(以下のクエリを参照)。その結果、適切なXMLスキーマは自動的に作成されません。依然としてクエリ を実行している間も、エラーが発生します。私はそれがエラーなしで実行するが、そのエラーが本当にどこにあるのか分からない。私は、CASE文でIIFSを交換することにより、すべての「=」を排除しようとしたが、その後、私は他のエラー(それが参考になる場合、私はその試みを投稿することができます) クエリはAccessで実行されますが、C#DataSetでエラーが発生します

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) 

クエリビルダからのエラーメッセージ

Error in list of function arguments: '=' not recognized. 
Unable to parse query text. 
を得ました

とにかく、ありがとうございました!

EDIT:

これはケース

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] 

でIIFSを交換する時、私の以前の試みだったと私は取得エラーが

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) 

は、しかし、すぐに、私はすべての合計は、(ケースまたはIIFSを通してそれを可能)追加すると、クエリでエラーが発生しただけで正常に動作します。

答えて

1

COALESCEを使用してNULL列を空の文字列に置き換え、CASEを使用してSUM内のIIFを置き換えることができます。

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

なぜクエリデザイナーは 'に' [COALESCE](Owners.OwnFirstName + ''、 '') '( ' '' Owners.OwnFirstName +')' COALESCEを変更したいですか? – Brad

+0

@ブラッドいいえ。 –

+0

あなたがそこにあるものを実行しようとすると、クエリ式に構文エラー(演算子がありません)が表示されます 'SUM(CASE WHEN UnitBarcodes.NephStatus =' N 'THEN 1 ELSE 0 END) 'それで、フレーズ。 (これは、Accessで試行されたときです。私はまた、VSで 'diffferentというエラーが出ます。IErrorInfo.GetdescriptionがE_FAIL(0x80004005)で失敗しました。) – Brad

0

IIF文をCASE文に変換する必要があります.IIFは有効なT-SQL構文ではありません。あなたのコメントを受けて

、それがnullチェックがT-SQLで実行される方法ではありません、ここでの例です:

CASE 
    WHEN SomeValue IS NULL THEN 
      SomeDefault 
    ELSE 
      SomeValue 

END 
+0

上記の私の編集を参照してください。 – Brad

+0

@Maess [COALESCE](http://msdn.microsoft.com/en-us/library/ms190349.aspx)と[ISNULL](http://msdn.microsoft.com/en-us/library/ja) us/library/ms184325.aspx)関数を使用します。 ;-) –

+0

こんにちはJoe、私はCOALESCEを認識していますが、CASEやnullチェックの方法などの基礎から始めなければなりません。はい、それのための機能がありますが、それが実際にどのように動作するかで始まる方が良いです。 – Maess

0

構文エラーがたくさん。

あなたが最後に行った試行を公式に行い、いくつかの誤りを修正しました。これはあなたのために働くことを望みます。

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

私はこれを試しましたが、それでもエラーが出ます。私は小さな部分に分解しようとしました。 AS [ネフユニット] (Nifユニットの場合)[SUM(UnitBarcodes.NephStatus = 'N'、次に1 else 0 endの場合) FROM MicroPEMUnitBarcodes'はどちらもエラーを返します。エラーが発生した後の2番目のエラーは、私が望む方法でデータを返します。 (両方のエラーは「構文エラー」です) – Brad

+0

まあ、私はこれを降伏させなければなりません。今は質問がt-SQLを考慮していないようです。ジョー・ステファネリと同じように質問を誤解しました。私はこの1つであなたを助けることができないでしょう。ごめんなさい! – Johan

+0

:/うん、申し訳ありません。しかたがない。私はこれに取り組むつもりです。いずれにせよ助けてくれてありがとう。 – Brad

関連する問題