8
votes

Union distincte sur Select. Erreurs sur le type de données NTEXT

Je suis assez inutile à SQL mais je me trouve avoir à écrire une procédure stockée pour une recherche de keyphrase em>, j'essaie de faire une simple sélection de noms de noms. % Mot-clé Key% - Ensuite, une autre sélection sur la description -Same Mots-clés - et joindre (Union) Le 2 sélectionne. p>

Cependant, j'obtiens l'erreur: p> xxx pré>

J'ai essayé d'utiliser Union tout code> mais qui a renvoyé des lignes en double dans certaines instances ( Selon le mot-clé / la phrase). p>

J'ai également essayé de travailler à l'aide de tables temporaires et de sélectionner distinctes à ce sujet, mais c'est là que je suis vraiment confus. p>

Règles: strong> p>

  • Je ne peux pas changer le type de données li>
  • J'ai besoin des lignes de sélectionner sur le "nom" pour être au-dessus des lignes de la sélection sur la "Description" Li>
  • Je ne peux utiliser que 1 procédure stockée et ne peut pas modifier l'adaptateur de données, car je le branchez dans un système, je n'ai aucun contrôle. LI> ul>

    plus d'informations: strong> p>

    colonnes de table (l'important 2 que je travaille avec nom et une description): P>

    (SELECT        Products.ProductId, Name, Introduction, Description, Active, 
                Material, Colour, Dimensions, Photo, Price, DisplayOrder, FriendlyURL,
                ProductReference, Categories_Products_Lookup.CategoryId
    FROM            Products INNER JOIN
                    Categories_Products_Lookup ON 
                    Products.ProductId = Categories_Products_Lookup.ProductId
    WHERE           Active = 1 AND tProduct.Name like '%'+@Keyword+'%')
    UNION
    (SELECT        Products.ProductId, Name, Introduction, Description, Active, 
                Material, Colour, Dimensions, Photo, Price, DisplayOrder, FriendlyURL,
                ProductReference, Categories_Products_Lookup.CategoryId
    FROM            ProductsINNER JOIN
                    Categories_Products_Lookup ON 
                    Products.ProductId = Categories_Products_Lookup.ProductId
    WHERE           Active = 1 AND Products.Description like '%'+@Keyword+'%')
    


7 commentaires

Sur quelle version de SQL Server êtes-vous sur? Si 2005+ êtes-vous capable de modifier le type de données de la colonne en NvarchaRar (max) ? ntext est obsolète et difficile à travailler avec. NvarchaRar (Max) est son remplacement. Y a-t-il également une raison spécifique pour laquelle vous utilisez Union ici plutôt que ou ?


Bonjour Martin, j'utilise 2008 R2. Cependant, je ne pense pas que je puisse changer le type de données. Il y a un système complet de celui-ci et je ne sais pas quels effets frappants il aura à d'autres domaines. Qu'est-ce qui utiliserait ou faire? Je souhaite obtenir des résultats des deux sélectionneurs mais j'ai le choix de "Nom" qui sortez sur le dessus.


Eh bien, votre requête postée est un peu confus et invalide comme une branche mentionne une branche TPRODUCT dans le mais il n'y a pas de ce tableau dans le de et le autre produits mais en supposant qu'ils sont la même table. où actif = 1 et (produits.description comme "%" + @ @ keyword + '%') ou des produits.name Comme '%' + @ keyword + '%') ferait la même chose sans avoir à Scannez la table et effectuez la jointure deux fois, puis fusionnez les deux résultats.


Désolé, oui, la table TPRODUCT & Products est la même. J'ai légèrement édité avant de poster et j'ai manqué quelques changements. Il suffit de tester le ou - il ramène les résultats ok, mais dans le mauvais ordre. Je souhaite des lignes avec le mot-clé «Nom 'pour être au-dessus de TOUT Autres lignes. Le semble produire des résultats dans l'ordre d'identité.


La commande souhaitée ne se produirait pas avec votre requête Union , soit même si vous avez fait une distribution pour le faire fonctionner.


Il semblait travailler dans des tests lorsque j'ai utilisé Union tout . Il a placé des lignes avec le mot-clé dans le "nom" au-dessus des lignes avec le mot-clé dans 'Description'. Le problème est que si le mot clé est trop vague et retire beaucoup de résultats dans lesquels le mot clé est dans le nom, la description et dans le nom et la description. Il ajoute des lignes en double pour ce dernier.


Lorsque vous remplacez Union tout avec Union ils seront réinstallés dans le processus d'élimination en double. (Il n'est pas réellement garanti d'être le cas de Union tout non plus)


3 Réponses :


7
votes

Utilisez quelque chose comme 'Cast (description comme Nvarchar (2000)) comme description' au lieu des noms de champ Ntext.


3 commentaires

Salut Arvo, j'ai essayé votre suggestion et a remplacé toutes les références à la description avec cette déclaration de distribution, mais elle apparaît avec la même erreur: Le type de données NTEXT ne peut pas être sélectionné comme distinct car il n'est pas comparable


@Deadly appliquer le même couler sur matériau également (et tout autre texte impliqué dans l'opération Union )


Salut Arvo, merci pour la réponse. Je suis sûr que cela aurait travaillé, mais celui ci-dessus offrait une solution que je pouvais comprendre. À votre santé. :)



4
votes

des commentaires. Il semble que c'est ce dont vous avez besoin.

SELECT Products.ProductId,
       Name,
       Introduction,
       Description,
       Active,
       Material,
       Colour,
       Dimensions,
       Photo,
       Price,
       DisplayOrder,
       FriendlyURL,
       ProductReference,
       Categories_Products_Lookup.CategoryId
FROM   Products
       INNER JOIN Categories_Products_Lookup
         ON Products.ProductId = Categories_Products_Lookup.ProductId
WHERE  Active = 1
       AND ( Products.Description like '%' + @Keyword + '%'
              or Products.Name like '%' + @Keyword + '%' )
ORDER  BY CASE
            WHEN Products.Name like '%' + @Keyword + '%' THEN 0
            ELSE 1
          END  


1 commentaires

Tu es un génie! Je pense que je peux t'aimer! : D Merci beaucoup.



5
votes

Cette réponse est pour d'autres comme moi qui n'aura pas de problèmes avec des lignes en double.

Union Tout est probablement ce que vous voulez.

Voir le Documentation pour l'opérateur de l'Union < / a>.


1 commentaires

Solution parfaite! Je n'ai pas eu de problème en double.