Pourquoi cette procédure stockée simple ne fonctionne pas

Voici l'affaire, je reçois un tableau de C # et je veux l'insert dans le tableau suivant avec seulement 2 colonnes qui sont @idUser int et @idRegion int .

La procédure stockée doit recevoir le tableau et l'insert dans la table mais de toute façon cela ne fonctionne pas, il me dit qu'il ne peut pas convertir @idRegion à un int. J'ai essayé d'utiliser CAST et CONVERT pour le convertir en int mais cela ne fonctionne pas.

Le Select From fonctionne bien, mais pas l'insert.

Voici la procédure stockée ( @idUser doit être identique pour toutes les lignes insérées):

  @idUser int, @idRegion nvarchar(MAX) AS BEGIN INSERT INTO [UsersRegion] (idUser,IdRegion) VALUES (@idUser, @idRegion) SELECT @idUser,cast(value as int) FROM STRING_SPLIT(@idRegion,',') END 

J'ai cette erreur lors de l'exécution:

La conversion a échoué lors de la conversion de la valeur nvarchar '1,2,3,4' en type de données int.

Si vous envoyez plusieurs valeurs dans @idRegion, vous pouvez avoir plus d'une chose à insert lorsque vous les divisez. Par conséquent, faites comme ceci:

 INSERT INTO [UsersRegion] (idUser,IdRegion) SELECT @idUser, value FROM STRING_SPLIT(@idRegion, ',') 

Si la colonne IdRegion la table cible est de type int , vous devez IdRegion comme IdRegion :

 SELECT @idUser, cast(value as int) FROM STRING_SPLIT(@idRegion, ',') 

Le code ci-dessus insère le même @idUser pour chaque logging, mais une valeur différente pour IdRegion selon les éléments IdRegion . Plus sur Insérer dans sélectionner parmi

Votre instruction INSERT semble fonctionner avec IdRegion alors que tout le rest est en minuscule.

Cependant, en supposant que c'est ainsi que la colonne du tableau est nommée et n'est pas une faute de frappe …

Votre problème est probablement la ligne qui lit:
@idRegion nvarchar(MAX)
Qui déclare la variable @idRegion sous la forme d'une string, alors que vous avez indiqué dans la question qu'il s'agit d'un int. Cela expliquerait l'erreur de casting.

Si vous ne pouvez pas le passer dans la procédure comme un int à partir du code C #. Votre seule autre option serait d'essayer de l'parsingr dans un int comme vous l'avez dit.