Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

SQL Server 2000 - Procédure stockée - Erreur 446

3 réponses
Avatar
Gilbert Tordeur
Bonjour,

En créant la procédure stockée suivante, j'obtiens l'erreur 446 : impossible
de résoudre le classement en conflit de l'opération equal to, au moment de
vérifier sa syntaxe.

CREATE PROCEDURE dbo.Aatest
(
@ListeGroupes varchar(4095)
)
AS
SET NOCOUNT OFF;
SELECT
AupCodTypeIdentification
, AupNomDomaineIdentifiant
FROM AutorisationProgramme
JOIN ParseString(@ListeGroupes) Liste ON AupNomDomaineIdentifiant =
Liste.mot
;
GO

Le but est de sélectionner les enregistrements pour lequels le champ
AupNomDomaineIdentifiant (varchar 255) est égal à une des valeurs contenues
dans @ListeGroupes.

La fonction ParseString est la suivante :

/* Fonction traitant une liste de valeurs String pour permettre son emploi
comme critère de sélection dans une instruction SELECT */
/* Inspiré de http://www.sommarskog.se/arrays-in-sql-2000.html#iterative */
/* Gilbert Tordeur - 9/1/2007 */
CREATE FUNCTION dbo.ParseString
(
@liste varchar(4095)
)
RETURNS @tbl TABLE (mot varchar(255))
AS

BEGIN
DECLARE
@pos int
, @textpos int
, @tmpstr varchar(4095)
, @tmpval varchar(255)
, @delimiter char(1)

SET @textpos = 1
SET @delimiter = ','
SET @tmpstr = @liste
SET @textpos = 1
SET @pos = charindex(@delimiter, @tmpstr)

WHILE @pos > 0
BEGIN
SET @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
INSERT @tbl (mot) VALUES(@tmpval)
SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SET @pos = charindex(@delimiter, @tmpstr)
END

INSERT @tbl(mot) VALUES (ltrim(rtrim(@tmpstr)))
RETURN

END

Je ne comprends pas le message d'erreur, et suis donc dans l'incapacité d'y
remédier. Merci de votre aide.
Gilbert Tordeur

3 réponses

Avatar
SQLpro
Il suffit que vous pilotiez la collation adéquate dans l'opération de
comparaison des châines de caractère "=".

Lisez l'article que j'ai écrit à, ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/collations/

A +


Frédéric BROUARD - SQLpro - MVP SQL Server
Spécialiste SQL/BD modélisation de données
SQL & SGBDR http://sqlpro.developpez.com/
Expert SQL Server : http://www.sqlspot.com
audits - optimisation - tuning - formation


On 9 jan, 16:55, "Gilbert Tordeur" wrote:
Bonjour,

En créant la procédure stockée suivante, j'obtiens l'erreur 446 : im possible
de résoudre le classement en conflit de l'opération equal to, au momen t de
vérifier sa syntaxe.

CREATE PROCEDURE dbo.Aatest
(
@ListeGroupes varchar(4095)
)
AS
SET NOCOUNT OFF;
SELECT
AupCodTypeIdentification
, AupNomDomaineIdentifiant
FROM AutorisationProgramme
JOIN ParseString(@ListeGroupes) Liste ON AupNomDomaineIdentifiant =
Liste.mot
;
GO

Le but est de sélectionner les enregistrements pour lequels le champ
AupNomDomaineIdentifiant (varchar 255) est égal à une des valeurs cont enues
dans @ListeGroupes.

La fonction ParseString est la suivante :

/* Fonction traitant une liste de valeurs String pour permettre son emploi
comme critère de sélection dans une instruction SELECT */
/* Inspiré dehttp://www.sommarskog.se/arrays-in-sql-2000.html#iterative* /
/* Gilbert Tordeur - 9/1/2007 */
CREATE FUNCTION dbo.ParseString
(
@liste varchar(4095)
)
RETURNS @tbl TABLE (mot varchar(255))
AS

BEGIN
DECLARE
@pos int
, @textpos int
, @tmpstr varchar(4095)
, @tmpval varchar(255)
, @delimiter char(1)

SET @textpos = 1
SET @delimiter = ','
SET @tmpstr = @liste
SET @textpos = 1
SET @pos = charindex(@delimiter, @tmpstr)

WHILE @pos > 0
BEGIN
SET @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
INSERT @tbl (mot) VALUES(@tmpval)
SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SET @pos = charindex(@delimiter, @tmpstr)
END

INSERT @tbl(mot) VALUES (ltrim(rtrim(@tmpstr)))
RETURN

END

Je ne comprends pas le message d'erreur, et suis donc dans l'incapacité d'y
remédier. Merci de votre aide.
Gilbert Tordeur


Avatar
Philippe TROTIN [MS]
Bonjour,
Avec un COLLATE database_default par exemple

SELECT
AupCodTypeIdentification
, AupNomDomaineIdentifiant
FROM AutorisationProgramme
JOIN ParseString(@ListeGroupes) Liste ON AupNomDomaineIdentifiant
= Liste.mot COLLATE database_default





Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________

"Gilbert Tordeur" a écrit dans le message de
groupe de discussion :
Bonjour,

En créant la procédure stockée suivante, j'obtiens l'erreur 446 :
impossible de résoudre le classement en conflit de l'opération equal to,
au moment de vérifier sa syntaxe.

CREATE PROCEDURE dbo.Aatest
(
@ListeGroupes varchar(4095)
)
AS
SET NOCOUNT OFF;
SELECT
AupCodTypeIdentification
, AupNomDomaineIdentifiant
FROM AutorisationProgramme
JOIN ParseString(@ListeGroupes) Liste ON AupNomDomaineIdentifiant
= Liste.mot
;
GO

Le but est de sélectionner les enregistrements pour lequels le champ
AupNomDomaineIdentifiant (varchar 255) est égal à une des valeurs
contenues dans @ListeGroupes.

La fonction ParseString est la suivante :

/* Fonction traitant une liste de valeurs String pour permettre son emploi
comme critère de sélection dans une instruction SELECT */
/* Inspiré de http://www.sommarskog.se/arrays-in-sql-2000.html#iterative
*/
/* Gilbert Tordeur - 9/1/2007 */
CREATE FUNCTION dbo.ParseString
(
@liste varchar(4095)
)
RETURNS @tbl TABLE (mot varchar(255))
AS

BEGIN
DECLARE
@pos int
, @textpos int
, @tmpstr varchar(4095)
, @tmpval varchar(255)
, @delimiter char(1)

SET @textpos = 1
SET @delimiter = ','
SET @tmpstr = @liste
SET @textpos = 1
SET @pos = charindex(@delimiter, @tmpstr)

WHILE @pos > 0
BEGIN
SET @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
INSERT @tbl (mot) VALUES(@tmpval)
SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SET @pos = charindex(@delimiter, @tmpstr)
END

INSERT @tbl(mot) VALUES (ltrim(rtrim(@tmpstr)))
RETURN

END

Je ne comprends pas le message d'erreur, et suis donc dans l'incapacité
d'y remédier. Merci de votre aide.
Gilbert Tordeur





Avatar
Gilbert Tordeur
Merci à Philippe pour la solution, qui a effectivement résolu mon problème,
et merci à Frédéric pour l'article de fond, que je vais me farcir
aujourd'hui.
Bonne journée,
Gilbert Tordeur


"Philippe TROTIN [MS]" a écrit dans le
message de news:
Bonjour,
Avec un COLLATE database_default par exemple

SELECT
AupCodTypeIdentification
, AupNomDomaineIdentifiant
FROM AutorisationProgramme
JOIN ParseString(@ListeGroupes) Liste ON AupNomDomaineIdentifiant
= Liste.mot COLLATE database_default





Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________

"Gilbert Tordeur" a écrit dans le message de
groupe de discussion :
Bonjour,

En créant la procédure stockée suivante, j'obtiens l'erreur 446 :
impossible de résoudre le classement en conflit de l'opération equal to,
au moment de vérifier sa syntaxe.

CREATE PROCEDURE dbo.Aatest
(
@ListeGroupes varchar(4095)
)
AS
SET NOCOUNT OFF;
SELECT
AupCodTypeIdentification
, AupNomDomaineIdentifiant
FROM AutorisationProgramme
JOIN ParseString(@ListeGroupes) Liste ON AupNomDomaineIdentifiant
= Liste.mot
;
GO

Le but est de sélectionner les enregistrements pour lequels le champ
AupNomDomaineIdentifiant (varchar 255) est égal à une des valeurs
contenues dans @ListeGroupes.

La fonction ParseString est la suivante :

/* Fonction traitant une liste de valeurs String pour permettre son
emploi comme critère de sélection dans une instruction SELECT */
/* Inspiré de http://www.sommarskog.se/arrays-in-sql-2000.html#iterative
*/
/* Gilbert Tordeur - 9/1/2007 */
CREATE FUNCTION dbo.ParseString
(
@liste varchar(4095)
)
RETURNS @tbl TABLE (mot varchar(255))
AS

BEGIN
DECLARE
@pos int
, @textpos int
, @tmpstr varchar(4095)
, @tmpval varchar(255)
, @delimiter char(1)

SET @textpos = 1
SET @delimiter = ','
SET @tmpstr = @liste
SET @textpos = 1
SET @pos = charindex(@delimiter, @tmpstr)

WHILE @pos > 0
BEGIN
SET @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
INSERT @tbl (mot) VALUES(@tmpval)
SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SET @pos = charindex(@delimiter, @tmpstr)
END

INSERT @tbl(mot) VALUES (ltrim(rtrim(@tmpstr)))
RETURN

END

Je ne comprends pas le message d'erreur, et suis donc dans l'incapacité
d'y remédier. Merci de votre aide.
Gilbert Tordeur