Microsoft SQL Server/Problèmes connus

Un livre de Wikilivres.

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

L'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[modifier | modifier le wikicode]

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

OPENROWSET ou sp_OACreate tournent dans le vide pendant des heures[modifier | modifier le wikicode]

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

PRINT ne renvoie que des lignes blanches[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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

En PHP[modifier | modifier le wikicode]

Échec de l’ouverture de session / Login failed for username[modifier | modifier le wikicode]

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[3].

Erreur de contexte[modifier | modifier le wikicode]

Le mot de passe du compte a expiré.

Fatal error: Call to undefined function sqlsrv_connect()[modifier | modifier le wikicode]

Installer le pilote correspondant à la version de PHP du serveur Web :

  1. Télécharger sur https://www.microsoft.com/en-us/download/details.aspx?id=20098.
  2. Copier dans le dossier PHP (ex : C:\Program Files (x86)\EasyPHP\binaries\php\php_runningversion\ext).
  3. Ajouter à PHP.ini.
  4. Redémarrer le serveur Web.

L’autorisation SELECT a été refusée sur l’objet…[modifier | modifier le wikicode]

Cocher les rôles.

This extension requires the Microsoft ODBC Driver 11 for SQL Server[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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

Messages système[modifier | modifier le wikicode]

Sur 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[modifier | modifier le wikicode]

Ré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.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

Se 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[modifier | modifier le wikicode]

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'.[modifier | modifier le wikicode]

Cela 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.[modifier | modifier le wikicode]

Forcer 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)[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

Survient 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.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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é[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

Revoir 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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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


Impossible d'effectuer un cast d'un objet COM[modifier | modifier le wikicode]

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)"[modifier | modifier le wikicode]

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)".[modifier | modifier le wikicode]

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 :
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

Logo

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.[modifier | modifier le wikicode]

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) :

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[modifier | modifier le wikicode]

Utilisez 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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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


L'autorisation SELECT a été refusée sur l’objet...[modifier | modifier le wikicode]

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é[modifier | modifier le wikicode]

  • 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[modifier | modifier le wikicode]

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é[modifier | modifier le wikicode]

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'[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

Forcer 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[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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é.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

STA 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.[modifier | modifier le wikicode]

Probablement 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[modifier | modifier le wikicode]

Utiliser :

WITH REPLACE

À la fin de la commande de restauration.


Le nom 'xxx' n'est pas un identificateur valide.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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 :

-- 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[modifier | modifier le wikicode]

Scinder en plusieurs requêtes.


Le type de données de l'opérande datetime n'est pas valide pour l'opérateur sum[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

Il faut définir une contrainte d'unicité[10].


Les données de chaîne ou binaires seront tronquées[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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'[modifier | modifier le wikicode]

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


Ouvrez les guillemets après la chaîne de caractères[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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'.[modifier | modifier le wikicode]

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 '+'.[modifier | modifier le wikicode]

Les variables et les case sont interdits dans les from.


Syntaxe incorrecte vers le mot clé 'case'.[modifier | modifier le wikicode]

Les variables et les case sont interdits dans les from.


Syntaxe incorrecte vers le mot clé 'end'.[modifier | modifier le wikicode]

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'[modifier | modifier le wikicode]

  • 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.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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[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.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]