2010-08-06 4 views
0

J'ai une requête qui interroge une base de données SQL Server 2008 liée et joint les données d'une table dans cette base de données à une table dans SQL Server 2000. Il travaillait trouver jusqu'à l'une des colonnes dans la base de données SQL Server 2008 a été modifié en varchar (max). J'ai reçu une erreur et je l'ai corrigé en utilisant CAST (varchar (max) colonne AS varchar (50)). Maintenant, la performance de mes requêtes est lente par rapport à ce qu'elle était avant le changement. Pouvez-vous me donner des suggestions sur la façon de régler le problème? Merci pour votre temps.Varchar (max) 2008 à varchar en 2000

+0

Comment LEFT (VARCHARMAXCOLUMN, 50) se compare-t-il au CAST - ou cela ne fonctionne-t-il pas? –

+3

Pourquoi est-il défini comme 'Varchar (max)' s'il peut être converti en 'varchar (50)' avec succès? (c'est-à-dire que le type de données est de nouveau défini comme une option?) –

+0

Quelle était l'erreur que vous avez reçue? –

Répondre

3

Comme les autres commentateurs l'ont fait remarquer, pourquoi la colonne a-t-elle été changée en varchar (max) si elle peut être transtypée de manière fiable en varchar (50)? Varchar (max) était destiné à remplacer le type de données de texte et ne devait pas être simplement utilisé de manière désinvolte. Un simple varchar peut prendre en charge jusqu'à 8000 caractères et est reconnu par SQL 2000 et 2005.

Si vous faites cela cast() dans la liste de sélection, comme une condition de jointure, ou dans la clause where? Les requêtes distribuées sont déjà lentes et l'ajout de fonctions (cast, left, etc.) dans la clause where ou les conditions de jointure ne fera qu'empirer les choses.

En supposant que vous ne pouvez pas changer le varchar (max) à une varchar plaine, voici une idée

Est-ce que la boîte 2005 ont une connexion de serveur lié à la boîte SQL 2000? Si oui, pouvez-vous exécuter la requête de cette façon. La boîte 2005 sera capable de comparer le varchar (max) au varchar (50) directement.

+0

Oscar, postez des détails supplémentaires et nous essaierons de vous aider. –

+0

Le fournisseur est le propriétaire de la base de données (SQL Server 2008). Ils ont dû le changer en "Max" pour accommoder le long texte de diagnostic qui dans certains cas dépasserait la limite de 8000. J'ai l'autorisation de sélectionner sur la base de données pour extraire des données pour les rapports, mais je n'ai pas accès à créer un serveur lié. Je vais demander s'ils sont prêts à lier notre serveur SQL 2000 pour moi. Will A - J'ai essayé votre suggestion, mais elle a renvoyé une erreur "Le texte du type de données Argument n'est pas valide pour l'argument 1 de la fonction left." Merci pour la suggestion. – Oscar