2010-02-03 18 views
0

J'ai une requête comme ce qui suit:Comment exclure des lignes nulles sans exclure des cellules nulles lorsque j'utilise Excel dans C# en utilisant SQL (ADO)?

 
SELECT * FROM OPENROWSET('MSDASQL', 'Driver={Microsoft Excel Driver (*.xls)};DBQ=D:\test.xls','SELECT * FROM Sheet1$]') 

Cela ramène les lignes qui sont toutes nulles si elles ont jamais été édités puis supprimés. Je veux exclure ceux-ci, mais toujours inclure des lignes qui ont de bonnes données mais des cellules nulles possibles.

Mon premier instinct était de faire une « chaque colonne IS NOT NULL » ANDed ensemble, comme ceci:

 
SELECT * FROM OPENROWSET('MSDASQL', 'Driver={Microsoft Excel Driver (*.xls)}; DBQ=D:\test.xls', 'SELECT * FROM Sheet1$]') 
WHERE 
(
    Col1 IS NOT NULL 
    AND Col2 IS NOT NULL 
    AND Col3 IS NOT NULL 
    AND Col4 IS NOT NULL 
) 

Ceci élimine efficacement les lignes nulles, mais pour une raison quelconque, élimine également une ligne où Col4 avait une entrée nulle. J'ai essayé ceci avec et sans parens autour de la clause WHERE.

Est-ce que quelqu'un voit ce que je pourrais faire de mal, ou au lieu de cela, avoir une suggestion d'une méthode différente que je peux utiliser pour obtenir les mêmes résultats?

Ceci est actuellement en cours d'application en C# en utilisant ADO, mais je teste la requête en utilisant SQL Server Management Studio 2008.

+0

Ok ... alors je réalise que je peux le faire dans le code C#. Je pense toujours que c'est un comportement bizarre de SQL, donc j'aimerais voir des réponses ou des réflexions sur les raisons pour lesquelles cela ne fonctionne pas comme prévu dans SQL. – IronicMuffin

Répondre

3
WHERE 
(
    Col1 IS NOT NULL 
    OR Col2 IS NOT NULL 
    OR Col3 IS NOT NULL 
    OR Col4 IS NOT NULL 
) 

ou

OU Coalesce (Col1, Col2, Col3, Col4) N'EST PAS NULL (pas de fonction coalesce pour oledb/excel)

+0

Parce que cela est OR'd, n'exclura-t-il pas alors une ligne où une seule des colonnes est nulle? C'est quelque chose que je ne veux pas faire. – IronicMuffin

+0

Non, il inclura cette ligne. Imaginez-le comme si vous n'aviez que la première partie (col1 n'est pas nul). Cela ne montrerait que les lignes où col1 avait une valeur. Si col1 est null mais que col2 ne l'est pas, vous devez ignorer cette ligne. Vous devez donc autoriser col1 _or_col2 à être nul, mais pas les deux. Etc. –