Microsoft SQL Server/Problèmes connus
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
modifierFaire 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
modifierL'installation du module SQL_Search.exe[1] 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
:
-- Consultation
SELECT name
FROM sysobjects syso
order by name
-- Affichage
sp_helptext Procedure1
Messages d'erreur
modifierLes messages d'erreur sont aussi identifiés par des numéros[2].
OPENROWSET ou sp_OACreate tournent dans le vide pendant des heures
modifierUn processus bloque leurs ressources : redémarrer le serveur.
PRINT ne renvoie que des lignes blanches
modifierC'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
modifierC'est peut-être qu'il contient une jointure sans aucune correspondance.
En PHP
modifierÉchec de l’ouverture de session / Login failed for username
modifierSe 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[3].
Erreur de contexte
modifierLe mot de passe du compte a expiré.
Fatal error: Call to undefined function sqlsrv_connect()
modifierInstaller 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…
modifierCocher les rôles.
This extension requires the Microsoft ODBC Driver 11 for SQL Server
modifierInstaller 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
modifierSe procurer une autre DLL à renseigner dans PHP.ini (ex : lien du paragraphe précédent).
Messages système
modifierSur SQL Server 2008, les numéros des erreurs vont de 1 à 35999[4].
Avertissement : la valeur NULL est éliminée par un agrégat ou par une autre opération SET
modifierRésolu en remplaçant :
isnull(sum(
par
sum(isnull(
Ou encore :
where a = b
par
where isnull(a,0) = isnull(b,0)
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.
modifierVoir 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.
modifierSe produit lorsque le paramètre "DATAFILETYPE" est renseigné pour importer de l'Unicode dans un "BULK INSERT" :
BULK INSERT MaTable1
FROM 'D:\MonFIchier1.csv'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
DATAFILETYPE = 'widechar'
)
Comme SQL Server ne supporte pas UTF-8, il faut réencoder le fichier en UTF-16[5].
Chargement en masse impossible car le fichier "xxx" est impossible à ouvrir
modifierRetester 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'.
modifierCela se produit quand on tente un UPDATE sur un champ protégé[6]. 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.
modifierForcer la conversion en date :
INSERT INTO Table1 VALUES (convert(datetime, 'Date1', 121));
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)
modifierLors 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.
modifierSurvient quand on compare un texte avec un nombre. Dans cet exemple il suffit de remplacer 2
par '2'
:
select *
FROM Table1
where Champ1 = 2
Cela peut aussi se produire quand le premier résultat d'un case
est un entier et le second une chaine :
select case when x=y then Entier1 else Chaine1 end
-- doit devenir
select case when x=y then convert(varchar,Entier1,112) else Chaine1 end
Erreur de conversion des données varchar en int.
modifierS'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.
modifierLors 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é
modifierLors 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
modifierAugmenter 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
modifierRevoir la syntaxe de l'insertion[7], ex :
INSERT INTO Table1 VALUES ('Ligne1_Champ1', 'Ligne1_Champ2'), ('Ligne2_Champ1', 'Ligne2_Champ2'), ('Ligne3_Champ1', 'Ligne3_Champ2');
Il manque un agrégat dans la liste de définition d'une instruction UPDATE
modifierUn 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
modifierUn champ doit avoir été tapé deux fois, ex : Table1.Champ1.Champ1.
Impossible d'effectuer un cast d'un objet COM
modifierLa 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)"
modifierLors 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)".
modifierEventuellement 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 :
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
- Checker les requêtes en attente qui peuvent verrouiller les nouvelles :
select * from sys.dm_exec_requests
Et les tuer en reportant leur "session_id" (alias "SPID", première colonne) à la place du nombre en exemple ci-dessous :
kill 135
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.
modifierAu 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) :
SET IDENTITY_INSERT table ON
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
modifierUtilisez sp_fulltext_database
pour activer la recherche en texte intégral dans la base[8].
Impossible de créer index sur la vue car celle-ci n'est pas liée au schéma
modifierIl 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
modifierAller 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.
modifierIl 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.
modifierLe fichier appelé dans OPENROWSET
n'a pas de feuille nommée "Feuil1".
L'autorisation SELECT a été refusée sur l’objet...
modifierDans 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é
modifier- 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 sansFROM
.
L'index se trouve en dehors des limites du tableau
modifierCela 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é
modifierOn 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'
modifierLors 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.
modifierPlacer 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
modifierForcer la conversion en date :
INSERT INTO Table1 VALUES (convert(datetime, 'Date1', 121));
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
modifierLa 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.
modifierUn 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é.
modifierIl 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.
modifierSTA signifie Single Threaded Apartment. Il faut donc passer en mode MTA (Multi-Threaded Apartment)[9].
Le [sic] identificateur qui commence par '...' est trop long. La longueur maximale est 128.
modifierProbablement dû à l'utilisation des guillemets comme séparateur de chaine. Remplacer :
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
par
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
Le jeu de sauvegarde contient la sauvegarde d'une base de données qui n'est pas la base de données
modifierUtiliser :
WITH REPLACE
À la fin de la commande de restauration.
Le nom 'xxx' n'est pas un identificateur valide.
modifierAjouter 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.
modifierLe 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 :
-- Si la table a trois champs :
INSERT INTO table1 (champ1, champ2) VALUES (champ1, champ2)
-- ou
INSERT INTO table1 VALUES (champ1, champ2, 0)
Le nombre d'expressions de valeurs de ligne de l'instruction INSERT dépasse le nombre maximal autorisé de 1000 valeurs de ligne
modifierScinder en plusieurs requêtes.
Le type de données de l'opérande datetime n'est pas valide pour l'opérateur sum
modifierOperand 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
modifierIl faut définir une contrainte d'unicité[10].
Les données de chaîne ou binaires seront tronquées
modifierL'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.
modifierPlacer 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.
modifierProvoqué 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'
modifierRemplacer les guillemets par des apostrophes : "xxx" → 'xxx'.
Ouvrez les guillemets après la chaîne de caractères
modifierLe 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.
modifierVoir 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
modifierIl 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'.
modifierLors 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 '+'.
modifierLes variables et les case
sont interdits dans les from
.
Syntaxe incorrecte vers le mot clé 'case'.
modifierLes variables et les case
sont interdits dans les from
.
Syntaxe incorrecte vers le mot clé 'end'.
modifierSi 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'
modifier- 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 :
SELECT SUM(Heures), Personnes FROM (
SELECT SUM(Heures), case Personnes when 'Mr X²' then 'Mr X' else Personnes end as Personnes
FROM TableH
group by Personnes) h -- Erreur sans cette lettre
group by Personnes
order by Personnes
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.
modifierIl 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.
modifierSi 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
[11], voire THROW
dans SQL 2014[12].
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.
modifierCela 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.
modifierProvoqué 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
modifierLors 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
modifier- ↑ 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