# Microsoft SQL Server/Problèmes connus

* Introduction
* Bases de données
* Gestion des utilisateurs
* Variables
* Tables
* Procédures stockées
* Fonctions
* Bases de données spatiales
* Performances
* Importer et exporter
* SugarCRM

## Annexes

* Mots réservés
* Problèmes connus
* Introduction
* Bases de données
* Gestion des utilisateurs
* Variables
* Tables
* Procédures stockées
* Fonctions
* Bases de données spatiales
* Performances
* Importer et exporter
* SugarCRM

## Annexes

* Mots réservés
* Problèmes connus
[ Modifier le sommaire ]
Voici une liste d'erreurs courantes avec leurs solutions.

## Certaines tables ou champs sont utilisables mais invisibles par l'explorateur d'objets du Management Studio

Faire un clic-droit sur la base ou la table et "Actualiser".

## Certaines procédures stockées sont utilisables mais invisibles par l'explorateur d'objets du Management Studio

L'installation du module SQL_Search.exe peut réparer cela. De plus cette extension propose une interface pour lancer des recherches de chaines de caractères dans la structure (pas dans les données).
Sinon elles sont accessibles en lecture seule avec sp_helptext :

## Messages d'erreur

Les messages d'erreur sont aussi identifiés par des numéros.

### OPENROWSET ou sp_OACreate tournent dans le vide pendant des heures

Un processus bloque leurs ressources : redémarrer le serveur.

### PRINT ne renvoie que des lignes blanches

C'est peut-être que la variable qu'il tente d'afficher a été concaténée avec NULL.

### SELECT isnull(...) renvoie quand-même NULL

C'est peut-être qu'il contient une jointure sans aucune correspondance.

### En PHP
#### Échec de l’ouverture de session / Login failed for username

Se produit quand on se connecte avec un compte SQL alors que c'est interdit. Pour les autoriser, dans SSMS, clic droit sur le serveur, Propriétés, Sécurité, cocher le deuxième bouton radio : Authentification Windows et SQL Server.

#### Erreur de contexte

Le mot de passe du compte a expiré.

#### Fatal error: Call to undefined function sqlsrv_connect

Installer le pilote correspondant à la version de PHP du serveur Web :
* Télécharger sur https://www.microsoft.com/en-us/download/details.aspx?id=20098.
* Copier dans le dossier PHP (ex : C:\Program Files (x86)\EasyPHP\binaries\php\php_runningversion\ext).
* Ajouter à PHP.ini.
* Redémarrer le serveur Web.

#### L’autorisation SELECT a été refusée sur l’objet…

Cocher les rôles.

#### This extension requires the Microsoft ODBC Driver 11 for SQL Server

Installer le pilote depuis https://www.microsoft.com/en-us/download/details.aspx?id=36434.

#### Unable to initialize module. Module compiled with module API=x. PHP compiled with module API=y. These options need to match

Se procurer une autre DLL à renseigner dans PHP.ini (ex : lien du paragraphe précédent).

### Messages système

Sur SQL Server 2008, les numéros des erreurs vont de 1 à 35999.

#### Avertissement : la valeur NULL est éliminée par un agrégat ou par une autre opération SET

Résolu en remplaçant :
par
Ou encore :
par

#### Chargement en masse : DataFileType a été spécifié à tort comme étant char. DataFileType sera considéré comme étant widechar, parce que le fichier de données a une signature Unicode.

Voir ci-dessous.

#### Chargement en masse : DataFileType a été spécifié à tort comme étant widechar. DataFileType sera considéré comme étant char, parce que le fichier de données n'a pas de signature Unicode.

Se produit lorsque le paramètre "DATAFILETYPE" est renseigné pour importer de l'Unicode dans un "BULK INSERT" :
Comme SQL Server ne supporte pas UTF-8, il faut réencoder le fichier en UTF-16.

#### Chargement en masse impossible car le fichier "xxx" est impossible à ouvrir

Retester avec le fichier dans un dossier accessible à tout le monde, situé sur le serveur SQL.

#### Échec de UPDATE car les options SET suivantes comportent des paramètres incorrects : 'ARITHABORT'.

Cela se produit quand on tente un UPDATE sur un champ protégé. Peut-être utiliser un pilote ODBC.

#### Échec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.

Forcer la conversion en date :
Si cela persiste, c'est que le résultat comporte une date impossible, comme le 31 février, juin, ou autres.

#### Erreur de conversion des données à charger en masse (troncation)

Lors d'une insertion, la valeur d'un champ dépasse ce qui était prévu. Par exemple en mode création il est en varchar(32) et qu'à la ligne indiquée par l'erreur on trouve une phrase de 33 lettres.

#### Échec de la conversion de la valeur varchar en type de données int.

Survient quand on compare un texte avec un nombre. Dans cet exemple il suffit de remplacer 2 par '2' :
Cela peut aussi se produire quand le premier résultat d'un case est un entier et le second une chaine :

#### Erreur de conversion des données varchar en int.

S'il y a une comparaison avec un littéral, le mettre entre apostrophe.

#### Échec du chargement en masse. Valeur NULL attendue dans la ligne du fichier de données 1, colonne 1. La colonne de destination est définie comme NOT NULL.

Lors d'une insertion, la valeur d'un champ qui doit être non nulle n'est pas définie.

#### Erreur lors de la localisation de Server/Instance spécifié

Lors d'une jointure entre deux serveurs, vérifier que les ports 1433 TCP et UDP des serveurs sont ouverts.
Si oui, recréer le serveur lié en indiquant le login et mot de passe distant tout en bas du menu "Sécurité", dans "Seront effectuées dans ce contexte de sécurité".

#### Fatal error: Allowed memory size of 134217728 bytes exhausted

Augmenter la valeur de la ligne memory_limit = 128M du fichier php.ini. Puis relancer IIS ou Apache.

#### Il y a moins de colonnes dans l'instruction INSERT que de valeurs spécifiées dans la clause VALUES

Revoir la syntaxe de l'insertion, ex :

#### Il manque un agrégat dans la liste de définition d'une instruction UPDATE

Un UPDATE n'arrive pas à sélectionner les champs à mettre à jour dans le WHERE. Essayer d'exécuter cette sous-requête individuellement.

#### Impossible d'appeler des méthodes sur char

Un champ doit avoir été tapé deux fois, ex : Table1.Champ1.Champ1.

#### Impossible d'effectuer un cast d'un objet COM

La connexion au serveur est devenue caduque (ex : car il a rebooté). Normalement en relançant la commande elle n'apparait plus.

#### Impossible d'extraire une ligne du fournisseur OLE DB "BULK" du serveur lié "(null)"

Lors d'une importation de fichier dans une table (BULK INSERT), le nombre de champs entre les deux ne correspond pas.

#### Impossible d'initialiser l'objet de la source de données du fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "(null)".

Eventuellement accompagné de : Le fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "(null)" a retourné le message "Erreur non spécifiée"..
Le fichier ou la feuille Excel à ouvrir avec ce pilote sont introuvables ou déjà ouverts. Il faut revoir la configuration (en retestant après chaque étape) :
* Rebooter le serveur.
* Nom du fichier et de la feuille sans espace, sur le serveur.
* 'Ad Hoc Distributed Queries' activé.
* Désactiver le contrôle de comptes Windows (UAC).
* Taper en DOS : regsvr32 C:\Windows\SysWOW64\msexcl40.dll.
* Répertoire final et temporaire accessible au compte "SQL Server Service" (ou relancer le service SQL server avec une plus haute permission). Pour trouver le chemin auquel le logiciel tente d'accéder, on peut utiliser Process Monitor.
* Activer :
* Checker les requêtes en attente qui peuvent verrouiller les nouvelles :
Et les tuer en reportant leur "session_id" (alias "SPID", première colonne) à la place du nombre en exemple ci-dessous :
Il est déconseiller de tuer les SPID dont le numéro est inférieur à 50 car ils sont réservés au système.

#### Impossible d'insérer une valeur explicite dans la colonne identité de la table table quand IDENTITY_INSERT est défini à OFF.

Au moins une clé de la table s'incrémente automatiquement, et ne peut pas être définie par une requête. Il faut soit la retirer des insertions, soit en désactiver la contrainte (ce qui ne stoppe pas l’auto-incrémentation) :

#### Impossible d'utiliser le prédicat CONTAINS ou FREETEXT sur table ou vue indexée, car il n'y a pas d'index de texte intégral

Utilisez sp_fulltext_database pour activer la recherche en texte intégral dans la base.

#### Impossible de créer index sur la vue car celle-ci n'est pas liée au schéma

Il faut recréer la vue avec l'option WITH SCHEMABINDING.

#### Impossible de détacher la base de données car elle est en cours d'utilisation ou Échec de ALTER DATABASE parce qu'un verrou n'a pas pu être placé dans la base de données

Aller dans le Moniteur d'activité (Ctrl + Alt + A) et fermer les connexions existante à la base en faisant Clique droit + Terminer le processus.

#### Impossible de lier au schéma vue car le nom n'est pas valide pour la liaison au schéma.

Il ne faut pas nommer la base de données dans la commandes, ni oublier le mot "dbo" : FROM [dbo].[table1].

#### Impossible de traiter l'objet "SELECT * FROM [Feuil1$]". Le fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "(null)" indique que l'objet n'a pas de colonne ou que l'utilisateur actuel ne dispose pas des autorisations nécessaires sur cet objet.

Le fichier appelé dans OPENROWSET n'a pas de feuille nommée "Feuil1".

#### L'autorisation SELECT a été refusée sur l’objet...

Dans SSMS, Sécurité, Connexions, il faut éditer le compte concerné dans Rôles du serveur, et cocher les cases manquantes.

#### L'identificateur en plusieurs parties "xxx" ne peut pas être lié

* Un champ de la sélection est absent des tables.
* Dans le cas d'une sélection de sélection, une table.champ de l'imbriquée n'est plus dans la seconde, il faut donc appeler le champ dans cette table en préfixe.
* Un UPDATE avec une jointure sans FROM.

#### L'index se trouve en dehors des limites du tableau

Cela peut se produire quand on manipule une grande base avec la version Express sur SSMS 2008.
Il faut alors passer par le code SQL plutôt que par SSMS, ou bien migrer en SSMS 2016.

#### La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP ou FOR XML est également spécifié

On peut utiliser top après select pour trier une sous-requête avec order by. Si le top

#### La colonne 'xxx' a été spécifiée plusieurs fois pour 'Z'

Lors d'un SELECT * FROM (SELECT * FROM X join Y) Z, les champs de X qui ont le même nom que ceux de Y font doublon dans Z. Il faut donc éviter d'utiliser *.

#### La colonne n'est pas valide dans la clause HAVING parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.

Placer simplement la colonne citée par l'erreur dans le group by au-dessus du having.

#### La conversion d'un type de données varchar en type de données (small)datetime a créé une valeur hors limites

Forcer la conversion en date :
Si cela persiste, c'est que le résultat comporte une date impossible, comme le 31 février, juin, ou autres.

#### La définition de l'objet 'ProcédureStockée1' a changé depuis la compilation

La procédure stockée a été mise à jour pendant son exécution. Il faut donc la relancer.

#### La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.

Un champ dans une requête imbriquée envoie plusieurs résultat au lieu d'un seul. Il est inclut dans l'opérande d'une formule avec opérateur de comparaison. Utiliser TOP 1.
Parfois un trigger doit être désactivé pour régler cela.

#### Le fournisseur OLE DB "Microsoft.ACE.OLEDB.12.0" n'a pas été enregistré.

Il faut l'installer depuis : https://www.microsoft.com/fr-FR/download/details.aspx?id=23734.

#### Le fournisseur OLE DB 'Microsoft.Jet.OLEDB.4.0' ne peut pas être utilisé pour les requêtes distribuées, car le fournisseur est configuré pour s'exécuter en mode STA.

STA signifie Single Threaded Apartment. Il faut donc passer en mode MTA (Multi-Threaded Apartment).

#### Le [sic] identificateur qui commence par '...' est trop long. La longueur maximale est 128.

Probablement dû à l'utilisation des guillemets comme séparateur de chaine. Remplacer :
par

#### Le jeu de sauvegarde contient la sauvegarde d'une base de données qui n'est pas la base de données

Utiliser :
À la fin de la commande de restauration.

#### Le nom 'xxx' n'est pas un identificateur valide.

Ajouter des parenthèses autour des paramètres de la fonction EXEC.

#### Le nom ou le numéro de colonne des valeurs fournies ne correspond pas à la définition de la table.

Le nombre de champ à insérer n'est pas le même que celui de la table, il faut donc soit les nommer entre parenthèses après la table, soit ajouter des valeurs par défaut aux champs manquants :

#### Le nombre d'expressions de valeurs de ligne de l'instruction INSERT dépasse le nombre maximal autorisé de 1000 valeurs de ligne

Scinder en plusieurs requêtes.

#### Le type de données de l'opérande datetime n'est pas valide pour l'opérateur sum

Operand data type datetime is invalid for sum operator.
Il convient de préférer DATEADD à SUM.

#### Les colonnes de la table ne correspondent pas à une clé primaire existante ou à une contrainte UNIQUE

Il faut définir une contrainte d'unicité.

#### Les données de chaîne ou binaires seront tronquées

L'insertion d'un enregistrement contient une valeur qui ne rentre pas dans un champ varchar(x). Il faut donc la tronquer ou bien modifier la taille du champ (ex : left(v, 50)).
Sinon il s'agit d'un caractère indésirable qui s'est glissé dans une chaine à insérer, le retrouver par exemple par dichotomie.

#### Les requêtes hétérogènes requièrent les options ANSI_NULLS et ANSI_WARNINGS pour être définies pour la connexion. Cela assure la cohérence sémantique de la requête. Activez ces options et relancez la requête.

Placer les commandes suivantes avant de recréer la procédure stockée : SET ANSI_NULLS ON SET ANSI_WARNINGS ON Sinon, vérifier qu'elles ne sont pas définies à OFF à un autre endroit.
Sinon, cela peut fonctionner depuis une requête séparée préalable.

#### Les valeurs DEFAULT et NULL ne sont pas autorisées comme valeurs d'identité explicites.

Provoqué par un INSERT d'une valeur nulle dans un champ clé AUTO_INCREMENT. Il suffit donc de ne pas modifier ce champ du tout quand on modifie son enregistrement.

#### Nom de colonne non valide : 'xxx'

Remplacer les guillemets par des apostrophes : "xxx" → 'xxx'.

#### Ouvrez les guillemets après la chaîne de caractères

Le nombre d'apostrophes délimitant les chaînes de caractères est impair, la balance n'est donc pas à l'équilibre. Sinon un " est utilisé comme un ' à tort.

#### Procédure stockée 'xxx' introuvable.

Voir ci-dessous.

#### SQL Server a bloqué l'accès à ... du composant '...', car ce composant est désactivé dans le cadre de la configuration de la sécurité du serveur

Il faut activer le module mentionné. Des exemples sont proposés dans le chapitre Importer et exporter pour sp_OACreate et Ad Hoc Distributed Queries.

#### Syntaxe incorrecte vers 'xxx'.

Lors de la sauvegarde d'une procédure stockée, si le curseur contient une sélection son contenu tente d'être exécuté indépendamment du reste du code. Il faut donc faire un clic ailleurs.

#### Syntaxe incorrecte vers '+'.

Les variables et les case sont interdits dans les from.

#### Syntaxe incorrecte vers le mot clé 'case'.

Les variables et les case sont interdits dans les from.

#### Syntaxe incorrecte vers le mot clé 'end'.

Si en passant la souris sur le end il est écrit "Attendu CONVERSATION", c'est qu'il suit un if vide.

#### Syntaxe incorrecte vers le mot clé 'group'

* Lors de plusieurs SELECT imbriqués, il faut nommer la sélection. L'exemple suivant fait la somme des heures de chaque personne, dont une qui a deux noms :

#### Un agrégat ne peut pas apparaître dans une clause WHERE à moins que ce ne soit une sous-requête contenue dans une clause HAVING ou une liste de sélection, et que la colonne à agréger soit une référence externe.

Il y a un count sur un champ de la requête dans sa sous-requête.

#### Une erreur de dépassement arithmétique s'est produite lors de la conversion de varchar en type de données numeric.

Si l'augmentation de la taille de la variable de destination ne suffit pas (ex : decimal(38,10)), il faut lever les exceptions, par exemple en ajoutant une condition en amont (ex : where (isnumeric(Chaine) = 1 and... )), ou TRY CATCH, voire THROW dans SQL 2014.

#### Une seule expression peut être spécifiée dans la liste de sélection quand la sous-requête n'est pas introduite par EXISTS.

Cela arrive quand dans la close WHERE une condition IN renvoie vers plusieurs champs au lieu d'un seul (ex : where Num_Client in (select * from...) au lieu de where Num_Client in (select Numero_Client from...)).

#### Une valeur explicite de la colonne identité de la table ne peut être spécifiée que si la liste des colonnes est utilisée et si IDENTITY_INSERT est défini sur ON.

Provoqué par un INSERT d'une valeur dans un champ clé AUTO_INCREMENT. Il suffit donc de ne pas modifier ce champ du tout quand on modifie son enregistrement.

#### Violation de la contrainte UNIQUE KEY

Lors d'une insertion dans une table dont la clé ne s'incrémente pas automatiquement, il faut soit y remédier soit la spécifier pour chaque enregistrement de l'insertion.

## Références

* ↑ https://www.red-gate.com/products/sql-development/sql-search/
* ↑ http://technet.microsoft.com/fr-fr/library/cc645611%28v=sql.105%29.aspx
* ↑ http://blog.sqlauthority.com/2014/01/17/sql-server-fix-login-failed-for-user-username-the-user-is-not-associated-with-a-trusted-sql-server-connection-microsoft-sql-server-error-18452/
* ↑ https://technet.microsoft.com/fr-fr/library/cc645603(v=sql.105).aspx
* ↑ https://aliiraza.wordpress.com/2012/06/05/bulk-load-datafiletype-was-incorrectly-specified-as-widechar-datafiletype-will-be-assumed-to-be-char-because-the-data-file-does-not-have-a-unicode-signature/?preview=true&preview_id=103&preview_nonce=3350b4ba67
* ↑ http://technet.microsoft.com/fr-fr/library/ms189118%28v=sql.105%29.aspx
* ↑ http://technet.microsoft.com/fr-fr/library/dd776381%28v=sql.105%29.aspx
* ↑ http://doc.nuxeo.com/plugins/viewsource/viewpagesrc.action?pageId=4685883
* ↑ https://msdn.microsoft.com/fr-fr/library/cc645919(v=sql.120).aspx
* ↑ http://office.microsoft.com/fr-fr/help/les-colonnes-de-la-table-0s-ne-correspondent-pas-a-une-cle-primaire-existante-ou-a-une-contrainte-unique-HP003083867.aspx
* ↑ https://msdn.microsoft.com/en-us/library/ms175976.aspx
* ↑ https://msdn.microsoft.com/fr-fr/library/Ee677615%28v=SQL.120%29.aspx