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 modifier

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

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

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

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

PRINT ne renvoie que des lignes blanches modifier

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

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

En PHP modifier

Échec de l’ouverture de session / Login failed for username modifier

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

Le mot de passe du compte a expiré.

Fatal error: Call to undefined function sqlsrv_connect() modifier

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

Cocher les rôles.

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

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

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

Messages système modifier

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

 

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

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

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

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

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

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

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


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

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

  • 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

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

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

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

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

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

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

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

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

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

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

Utiliser :

WITH REPLACE

À la fin de la commande de restauration.


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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

Les variables et les case sont interdits dans les from.


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

Les variables et les case sont interdits dans les from.


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

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

  • 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

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

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

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

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

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