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

SLQServeur 2000: Variable Proc Stock sur un IN

2 réponses
Avatar
Ryo
Bonjour,

J'ai une procédure stockée à laquelle je passe en paramètre le résultat d'un
traitement servant à connaitre les valeurs du IN de cette procédure.
En simplifiant, ma procédure est la suivante:

CREATE PROCEDURE [dbo].PocStock
@ID_List varchar(512)=NULL
AS

SELECT * FROM MaTAble
WHERE
MaTable_ID IN (@ID_List) OR @ID_List IS NULL

return 0
GO

Le problème étant que quand je passe à @ID_List plusieur valeur séparé par
une virgule (20,3,17 par ex.), j'obtient l'erreur suivante:
Erreur de syntaxe lors de la conversion de la valeur varchar '20,3,17' vers
une colonne de type de données int.
Alors je comprend l'erreur, par contre je vois pas comment faire marcher ma
procédure comme je l'entend. Des idées ?
Merci d'avance.

2 réponses

Avatar
Rudi Bruchez
Ryo a écrit:

Alors je comprend l'erreur, par contre je vois pas comment faire marcher ma
procédure comme je l'entend. Des idées ?



Bonjour,

Vous pouvez créer une fonction de type table qui parse la chaîne, ou passer
par du XML : http://sqlserver.developpez.com/faq/?page=Jeu#Jeu9

--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/
Avatar
Philippe TROTIN [MS]
Bonjour,

SELECT * FROM dbo.cf_GetSplitTable('AAA#BBBBB#CCCC', '#')
=> Renvoi une table


avec la fonction :

CREATE FUNCTION [dbo].[cf_GetSplitTable]
(
@sText nvarchar(max),
@sDelim nvarchar(20) = ' '
)
RETURNS @MySplitTable TABLE (MY_VALUE nvarchar(4000) COLLATE
database_default, MY_ORDER int)
BEGIN

DECLARE @Val_Next_1 int
DECLARE @Val_Next_2 int
DECLARE @OccurenceNumber int

-- If the separator is not find
SET @Val_Next_1 = CHARINDEX(@sDelim, @sText)

IF (@Val_Next_1 = 0 OR @Val_Next_1 IS NULL)
BEGIN
IF @sText <> ''
BEGIN
INSERT INTO @MySplitTable( MY_VALUE, MY_ORDER )
VALUES( @sText, 1 )
END

RETURN
END

-- Insert the first occurence
SET @OccurenceNumber = 1

INSERT INTO @MySplitTable( MY_VALUE, MY_ORDER )
VALUES( SUBSTRING(@sText, 1, @Val_Next_1 - 1), @OccurenceNumber )

-- Insert all other occurence
WHILE ( 1 = 1 )
BEGIN
SET @Val_Next_1 = CHARINDEX(@sDelim, @sText)
SET @Val_Next_2 = CHARINDEX(@sDelim, SUBSTRING(@sText, @Val_Next_1 + 1,
4000))

SET @sText = SUBSTRING(@sText, @Val_Next_1 + 1, 4000)

IF @Val_Next_2 <> 0
BEGIN
SET @OccurenceNumber = @OccurenceNumber + 1

INSERT INTO @MySplitTable( MY_VALUE, MY_ORDER )
VALUES( SUBSTRING(@sText, 1, @Val_Next_2 - 1), @OccurenceNumber )
END
ELSE
BEGIN
IF @sText <> ''
BEGIN
SET @OccurenceNumber = @OccurenceNumber + 1

INSERT INTO @MySplitTable( MY_VALUE, MY_ORDER )
VALUES( @sText, @OccurenceNumber )
END
BREAK
END
END

RETURN
END


Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________

"Rudi Bruchez" <rudi#nospam#at#babaluga.com> a écrit dans le message de
groupe de discussion : yocd1bom3p8u$
Ryo a écrit:

Alors je comprend l'erreur, par contre je vois pas comment faire marcher
ma
procédure comme je l'entend. Des idées ?



Bonjour,

Vous pouvez créer une fonction de type table qui parse la chaîne, ou
passer
par du XML : http://sqlserver.developpez.com/faq/?page=Jeu#Jeu9

--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/