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.
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 codice_1 :
-- Consultation
SELECT name
FROM sysobjects syso
order by name
-- Affichage
sp_helptext Procedure1
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 codice_2.
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 :
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 :
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..
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" :
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.
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 :
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).
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 codice_3 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 codice_4 par codice_5 :
select *
FROM Table1
where Champ1 = 2
Cela peut aussi se produire quand le premier résultat d'un codice_6 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..
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 :
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.
Un codice_7 n'arrive pas à sélectionner les champs à mettre à jour dans le codice_8. 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 (codice_9), 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) :
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
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
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) :
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.
Utilisez codice_10 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 codice_11.
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" : codice_12.
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 codice_13 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'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 codice_16, 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 codice_17 au-dessus du codice_18.
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 :
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.
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 codice_19.
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 identificateur qui commence par '...' est trop long. La longueur maximale est 128..
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.
Utiliser :
 WITH REPLACE
À 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 codice_20.
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 :
-- 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.
Scinder en plusieurs requêtes.
Le type de données de l'opérande datetime n'est pas valide pour l'opérateur sum.
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 : codice_21).
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 codice_22 d'une valeur nulle dans un champ clé codice_23. 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 codice_24 et codice_25.
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 codice_6 sont interdits dans les codice_27.
Syntaxe incorrecte vers le mot clé 'case'..
Les variables et les codice_6 sont interdits dans les codice_27.
Syntaxe incorrecte vers le mot clé 'end'..
Si en passant la souris sur le codice_30 il est écrit "Attendu CONVERSATION", c'est qu'il suit un codice_31 vide.
Syntaxe incorrecte vers le mot clé 'group'.
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..
Il y a un codice_32 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 : codice_33), il faut lever les exceptions, par exemple en ajoutant une condition en amont (ex : codice_34), ou codice_35, voire codice_36 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 : codice_37 au lieu de codice_38.
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 codice_22 d'une valeur dans un champ clé codice_23. 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.