OVH Cloud OVH Cloud

problème text procédure stockée (seulement quand j'update)

17 réponses
Avatar
ucasesoftware
source de l'erreur :
@resume text =3Dnull,

erreur :
Seuls les pointeurs de texte sont autoris=E9s dans les tables de
travail, jamais les colonnes text, ntext ou image. Le processeur de
requ=EAtes a fourni un plan de requ=EAte n=E9cessitant une colonne text,
ntext ou image dans une table de travail

PROCEDURE :
CREATE PROCEDURE [procEntrepriseUpdate]
@centreGuid uniqueidentifier =3D null,
@entrepriseGuid uniqueidentifier,
@isCentre bit,
@dateCreate datetime,
@raisonSociale nvarchar(50),
@logo image =3D null,
@Adresse nvarchar(300),
@telephone nvarchar(20)=3D null,
@telecopie nvarchar(20) =3D null,
@mobile nvarchar(20) =3Dnull,
@email nvarchar(350) =3Dnull,
@url nvarchar(350) =3D null,
@siret nvarchar(20) =3Dnull,
@codeNaf nvarchar(10) =3Dnull,
@resume text =3Dnull,
@maxSalarie int =3Dnull,
@isActive bit,
@activeOffReason nvarchar(300) =3Dnull,
@isArchive bit,
@isAbonneSms bit,
@dateAbonneSms datetime =3Dnull,
@nbSmsRecu int,
@isAbonneFax bit,
@dateAbonneFax datetime =3Dnull,
@nbFaxRecu int,
@baseInternetAdd bit,
@baseInternetUpdate bit,
@dateBaseInternet datetime =3Dnull
AS
IF exists (SELECT entrepriseGuid FROM entreprise WHERE entrepriseGuid
=3D @entrepriseGuid)
UPDATE entreprise
SET
centreGuid =3D @centreGuid,
entrepriseGuid =3D @entrepriseGuid,
isCentre =3D @isCentre,
dateCreate =3D @dateCreate,
raisonSociale =3D @raisonSociale,
logo =3D @logo,
Adresse =3D @Adresse,
telephone =3D @telephone,
telecopie =3D @telecopie,
mobile =3D @mobile,
email =3D @email,
url =3D @url,
siret =3D @siret,
codeNaf =3D @codeNaf,
resume =3D @resume,
maxSalarie =3D @maxSalarie,
isActive =3D @isActive,
activeOffReason =3D @activeOffReason,
isArchive =3D @isArchive,
isAbonneSms =3D @isAbonneSms,
dateAbonneSms =3D @dateAbonneSms,
nbSmsRecu =3D @nbSmsRecu,
isAbonneFax =3D @isAbonneFax,
dateAbonneFax =3D @dateAbonneFax,
nbFaxRecu =3D @nbFaxRecu,
baseInternetAdd =3D @baseInternetAdd,
baseInternetUpdate =3D @baseInternetUpdate,
dateBaseInternet =3D @dateBaseInternet
WHERE entrepriseGuid =3D @entrepriseGuid

GO

7 réponses

1 2
Avatar
Med Bouchenafa
L'erreur que tu signales ( 8629) et celle (8626) que rencontre l'auteur du
message initial sont differentes
"Only text pointers are allowed in work tables, never text, ntext, or image
columns.
The query processor produced a query plan that required a text, ntext, or
image column in a work table."

Cette seconde erreur est plus subtile est peut avoir différentes causes.
Elle est signalée dans quelques articles de la KB.

Si les petits trucs que j'ai signalés n'aident pas, je conseille à l'auteur
de se rapprocher du support Microsoft


--
Bien cordialement
Med Bouchenafa

"Bouarroudj Mohamed" a écrit dans le message de
news: OKG6xa%
Evidement ici l'interdiction veut dire que c'est pas une bonne pratique de
modifier la clé primaire, bien que SQL Server l'autorise

Pour le changement du text et du clustred index dans une seule operation
on
peut avoir le message suivant :

"The query processor could not produce a query plan from the optimizer
because a query cannot update a text, ntext, or image column and a
clustering key at the same time"

le BOL fait reference a ce probleme, voir la commande UPDATE

"If an update query could alter more than one row while updating both the
clustering key and one or more text, image, or Unicode columns, the update
operation fails and SQL Server returns an error message."

bien que la commande "UPDATE tblTest SET a = 2, b= 'bbbbbbbbbbbbbb' WHERE
a
= 1"
marche, elle PEUT generer le message cité en haut, je pense que s'arrive
si
l'operation engendre un split des pages ou un transfert d'un row d'une
page
a une autre



"Med Bouchenafa" wrote in message
news:
> Tu devrais jamais inclure un PK dans la clause UPDATE, un PK ne DOIT
> JAMAIS
> etre modifié

D'où vient cette interdiction?
Pourqoui interdire ce que SQL Server a autorisé?

Voici un exemple
CREATE TABLE tblTest
(
a INT PRIMARY KEY,
b TEXT
)

INSERT INTO tblTest (a,b) VALUES(1, 'aaaaaaaaaaaa')

UPDATE tblTest SET a = 2, b= 'bbbbbbbbbbbbbb' WHERE a = 1


--
Bien cordialement
Med Bouchenafa

"SM" a écrit dans le message de news:

> Je pense que SQLServer2000 ne permet pas d'updater dans une seule
> operation
> un clustererd index et une colonne de type text et j'imagine que
> "entrepriseGuid" est un clustered index ce qui cause l'erreur,
> Essaie de supprimer entrepriseGuid = @entrepriseGuid dans ton update et
> voir
> si le probleme disparait !
>
> Tu devrais jamais inclure un PK dans la clause UPDATE, un PK ne DOIT
> JAMAIS
> etre modifié
>
>
> wrote in message
> news:
> source de l'erreur :
> @resume text =null,
>
> erreur :
> Seuls les pointeurs de texte sont autorisés dans les tables de
> travail, jamais les colonnes text, ntext ou image. Le processeur de
> requêtes a fourni un plan de requête nécessitant une colonne text,
> ntext ou image dans une table de travail
>
> PROCEDURE :
> CREATE PROCEDURE [procEntrepriseUpdate]
> @centreGuid uniqueidentifier = null,
> @entrepriseGuid uniqueidentifier,
> @isCentre bit,
> @dateCreate datetime,
> @raisonSociale nvarchar(50),
> @logo image = null,
> @Adresse nvarchar(300),
> @telephone nvarchar(20)= null,
> @telecopie nvarchar(20) = null,
> @mobile nvarchar(20) =null,
> @email nvarchar(350) =null,
> @url nvarchar(350) = null,
> @siret nvarchar(20) =null,
> @codeNaf nvarchar(10) =null,
> @resume text =null,
> @maxSalarie int =null,
> @isActive bit,
> @activeOffReason nvarchar(300) =null,
> @isArchive bit,
> @isAbonneSms bit,
> @dateAbonneSms datetime =null,
> @nbSmsRecu int,
> @isAbonneFax bit,
> @dateAbonneFax datetime =null,
> @nbFaxRecu int,
> @baseInternetAdd bit,
> @baseInternetUpdate bit,
> @dateBaseInternet datetime =null
> AS
> IF exists (SELECT entrepriseGuid FROM entreprise WHERE entrepriseGuid
> = @entrepriseGuid)
> UPDATE entreprise
> SET
> centreGuid = @centreGuid,
> entrepriseGuid = @entrepriseGuid,
> isCentre = @isCentre,
> dateCreate = @dateCreate,
> raisonSociale = @raisonSociale,
> logo = @logo,
> Adresse = @Adresse,
> telephone = @telephone,
> telecopie = @telecopie,
> mobile = @mobile,
> email = @email,
> url = @url,
> siret = @siret,
> codeNaf = @codeNaf,
> resume = @resume,
> maxSalarie = @maxSalarie,
> isActive = @isActive,
> activeOffReason = @activeOffReason,
> isArchive = @isArchive,
> isAbonneSms = @isAbonneSms,
> dateAbonneSms = @dateAbonneSms,
> nbSmsRecu = @nbSmsRecu,
> isAbonneFax = @isAbonneFax,
> dateAbonneFax = @dateAbonneFax,
> nbFaxRecu = @nbFaxRecu,
> baseInternetAdd = @baseInternetAdd,
> baseInternetUpdate = @baseInternetUpdate,
> dateBaseInternet = @dateBaseInternet
> WHERE entrepriseGuid = @entrepriseGuid
>
> GO
>
>








Avatar
Thierry
Quel est intérêt d'écrire :

UPDATE entreprise
SET
...
entrepriseGuid = @entrepriseGuid,
...
WHERE entrepriseGuid = @entrepriseGuid

???

--
Thierry


a écrit dans le message de news:

Voici la solution que j'ai mis en place

Frédérique tu peux me confirmer qu'elle est bonne (pour moi elle
marche en test)
CREATE PROCEDURE [procEntrepriseUpdate]
@centreGuid uniqueidentifier = null,
@entrepriseGuid uniqueidentifier,
@isCentre bit,
@dateCreate datetime,
@raisonSociale nvarchar(50),
@logo image ,
@Adresse nvarchar(300),
@telephone nvarchar(20)= null,
@telecopie nvarchar(20) = null,
@mobile nvarchar(20) =null,
@email nvarchar(350) =null,
@url nvarchar(350) = null,
@siret nvarchar(20) =null,
@codeNaf nvarchar(10) =null,
@resume text,
@maxSalarie int =null,
@isActive bit,
@activeOffReason nvarchar(300) =null,
@isArchive bit,
@isAbonneSms bit,
@dateAbonneSms datetime =null,
@nbSmsRecu int,
@isAbonneFax bit,
@dateAbonneFax datetime =null,
@nbFaxRecu int,
@baseInternetAdd bit,
@baseInternetUpdate bit,
@dateBaseInternet datetime =null

AS
IF exists (SELECT entrepriseGuid FROM entreprise WHERE entrepriseGuid
= @entrepriseGuid)
UPDATE entreprise
SET
centreGuid = @centreGuid,
entrepriseGuid = @entrepriseGuid,
isCentre = @isCentre,
dateCreate = @dateCreate,
raisonSociale = @raisonSociale,
Adresse = @Adresse,
telephone = @telephone,
telecopie = @telecopie,
mobile = @mobile,
email = @email,
url = @url,
siret = @siret,
codeNaf = @codeNaf,
maxSalarie = @maxSalarie,
isActive = @isActive,
activeOffReason = @activeOffReason,
isArchive = @isArchive,
isAbonneSms = @isAbonneSms,
dateAbonneSms = @dateAbonneSms,
nbSmsRecu = @nbSmsRecu,
isAbonneFax = @isAbonneFax,
dateAbonneFax = @dateAbonneFax,
nbFaxRecu = @nbFaxRecu,
baseInternetAdd = @baseInternetAdd,
baseInternetUpdate = @baseInternetUpdate,
dateBaseInternet = @dateBaseInternet
WHERE entrepriseGuid = @entrepriseGuid



UPDATE entreprise
SET logo = NULL
WHERE logo IS NULL and entrepriseGuid = @entrepriseGuid

DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(entreprise.logo)
From entreprise


WHERE entrepriseGuid = @entrepriseGuid
WRITETEXT entreprise.logo @ptrval @logo

UPDATE entreprise
SET resume = NULL
WHERE resume IS NULL and entrepriseGuid = @entrepriseGuid


DECLARE @ptrvalResume binary(16)
SELECT @ptrvalResume = TEXTPTR(entreprise.resume)
From entreprise
WHERE entrepriseGuid = @entrepriseGuid
WRITETEXT entreprise.resume @ptrvalResume @resume



GO
Avatar
Fred BROUARD
a écrit:
oui je l'ai fait et ca marche...

par contre quand ntext = null ca pause problème Fredéric

Et ce que je comprends pas c'est pourquoi à l'insert ca passe sans
WriteText ?



Cela dépend de la longueur des tuples manipulés au niveau lecture. la limite est
de 8060 octets.

A +





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Fred BROUARD
a part la remarque de thierry c'est bon. Le seul est qu'une telle requête n'est
pas transactionnable. En effet les opérations d'écriture/lecture de blob ne sont
pas journalisées...

A +

a écrit:
Voici la solution que j'ai mis en place

Frédérique tu peux me confirmer qu'elle est bonne (pour moi elle
marche en test)
CREATE PROCEDURE [procEntrepriseUpdate]
@centreGuid uniqueidentifier = null,
@entrepriseGuid uniqueidentifier,
@isCentre bit,
@dateCreate datetime,
@raisonSociale nvarchar(50),
@logo image ,
@Adresse nvarchar(300),
@telephone nvarchar(20)= null,
@telecopie nvarchar(20) = null,
@mobile nvarchar(20) =null,
@email nvarchar(350) =null,
@url nvarchar(350) = null,
@siret nvarchar(20) =null,
@codeNaf nvarchar(10) =null,
@resume text,
@maxSalarie int =null,
@isActive bit,
@activeOffReason nvarchar(300) =null,
@isArchive bit,
@isAbonneSms bit,
@dateAbonneSms datetime =null,
@nbSmsRecu int,
@isAbonneFax bit,
@dateAbonneFax datetime =null,
@nbFaxRecu int,
@baseInternetAdd bit,
@baseInternetUpdate bit,
@dateBaseInternet datetime =null

AS
IF exists (SELECT entrepriseGuid FROM entreprise WHERE entrepriseGuid
= @entrepriseGuid)
UPDATE entreprise
SET
centreGuid = @centreGuid,
entrepriseGuid = @entrepriseGuid,
isCentre = @isCentre,
dateCreate = @dateCreate,
raisonSociale = @raisonSociale,
Adresse = @Adresse,
telephone = @telephone,
telecopie = @telecopie,
mobile = @mobile,
email = @email,
url = @url,
siret = @siret,
codeNaf = @codeNaf,
maxSalarie = @maxSalarie,
isActive = @isActive,
activeOffReason = @activeOffReason,
isArchive = @isArchive,
isAbonneSms = @isAbonneSms,
dateAbonneSms = @dateAbonneSms,
nbSmsRecu = @nbSmsRecu,
isAbonneFax = @isAbonneFax,
dateAbonneFax = @dateAbonneFax,
nbFaxRecu = @nbFaxRecu,
baseInternetAdd = @baseInternetAdd,
baseInternetUpdate = @baseInternetUpdate,
dateBaseInternet = @dateBaseInternet
WHERE entrepriseGuid = @entrepriseGuid



UPDATE entreprise
SET logo = NULL
WHERE logo IS NULL and entrepriseGuid = @entrepriseGuid

DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(entreprise.logo)
From entreprise


WHERE entrepriseGuid = @entrepriseGuid
WRITETEXT entreprise.logo @ptrval @logo

UPDATE entreprise
SET resume = NULL
WHERE resume IS NULL and entrepriseGuid = @entrepriseGuid


DECLARE @ptrvalResume binary(16)
SELECT @ptrvalResume = TEXTPTR(entreprise.resume)
From entreprise
WHERE entrepriseGuid = @entrepriseGuid
WRITETEXT entreprise.resume @ptrvalResume @resume



GO




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Med Bouchenafa
La seconde partie du UPDATE peut largement se simplifier à:
UPDATE entreprise
SET logo = @logo,
resume = @resume
FROM entreprise
WHERE entrepriseGuid = @entrepriseGuid
Il est nullement besoin de faire appel a WRITETEXT et consoeurs.
Ne pas oublier d'inclure les deux UPDATE dans une transaction pour que
l'opération soit unique et intègre

--
Bien cordialement
Med Bouchenafa

wrote in message
news:
Voici la solution que j'ai mis en place

Frédérique tu peux me confirmer qu'elle est bonne (pour moi elle
marche en test)
CREATE PROCEDURE [procEntrepriseUpdate]
@centreGuid uniqueidentifier = null,
@entrepriseGuid uniqueidentifier,
@isCentre bit,
@dateCreate datetime,
@raisonSociale nvarchar(50),
@logo image ,
@Adresse nvarchar(300),
@telephone nvarchar(20)= null,
@telecopie nvarchar(20) = null,
@mobile nvarchar(20) =null,
@email nvarchar(350) =null,
@url nvarchar(350) = null,
@siret nvarchar(20) =null,
@codeNaf nvarchar(10) =null,
@resume text,
@maxSalarie int =null,
@isActive bit,
@activeOffReason nvarchar(300) =null,
@isArchive bit,
@isAbonneSms bit,
@dateAbonneSms datetime =null,
@nbSmsRecu int,
@isAbonneFax bit,
@dateAbonneFax datetime =null,
@nbFaxRecu int,
@baseInternetAdd bit,
@baseInternetUpdate bit,
@dateBaseInternet datetime =null

AS
IF exists (SELECT entrepriseGuid FROM entreprise WHERE entrepriseGuid
= @entrepriseGuid)
UPDATE entreprise
SET
centreGuid = @centreGuid,
entrepriseGuid = @entrepriseGuid,
isCentre = @isCentre,
dateCreate = @dateCreate,
raisonSociale = @raisonSociale,
Adresse = @Adresse,
telephone = @telephone,
telecopie = @telecopie,
mobile = @mobile,
email = @email,
url = @url,
siret = @siret,
codeNaf = @codeNaf,
maxSalarie = @maxSalarie,
isActive = @isActive,
activeOffReason = @activeOffReason,
isArchive = @isArchive,
isAbonneSms = @isAbonneSms,
dateAbonneSms = @dateAbonneSms,
nbSmsRecu = @nbSmsRecu,
isAbonneFax = @isAbonneFax,
dateAbonneFax = @dateAbonneFax,
nbFaxRecu = @nbFaxRecu,
baseInternetAdd = @baseInternetAdd,
baseInternetUpdate = @baseInternetUpdate,
dateBaseInternet = @dateBaseInternet
WHERE entrepriseGuid = @entrepriseGuid



UPDATE entreprise
SET logo = NULL
WHERE logo IS NULL and entrepriseGuid = @entrepriseGuid

DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(entreprise.logo)
From entreprise


WHERE entrepriseGuid = @entrepriseGuid
WRITETEXT entreprise.logo @ptrval @logo

UPDATE entreprise
SET resume = NULL
WHERE resume IS NULL and entrepriseGuid = @entrepriseGuid


DECLARE @ptrvalResume binary(16)
SELECT @ptrvalResume = TEXTPTR(entreprise.resume)
From entreprise
WHERE entrepriseGuid = @entrepriseGuid
WRITETEXT entreprise.resume @ptrvalResume @resume



GO
Avatar
ucasesoftware
Med mais je suis bien obligé d'inclure des WRITETEXT... sinon ca
fonctionnerai pas... je comprends pas pourquoi tu me dis que j'en ai
pas besoin ?
Avatar
Med Bouchenafa
>>sinon cafonctionnerai pas...




Pourquoi tu dis ca?
Ou as-tu vu qu'il faut obligatoirement un WRITETEXT?

Voici petit exemple de table qui te demontre le contraire
J'ai mis volontaireemt 3 champs TEXT pour que la ligne depasse vraiment la
taille d'une page
CREATE TABLE tblTest
(
a int identity,
b text,
c text,
d text
)

INSERT INTO tblTest (b, c, d) VALUES (REPLICATE('b', 8000),REPLICATE('c',
8000), REPLICATE('d', 8000))
UPDATE tblTest SET b= REPLICATE('e', 8000), c= REPLICATE('f', 8000), d=
REPLICATE('g', 8000)


--
Bien cordialement
Med Bouchenafa

wrote in message
news:
Med mais je suis bien obligé d'inclure des WRITETEXT... sinon ca
fonctionnerai pas... je comprends pas pourquoi tu me dis que j'en ai
pas besoin ?
1 2