为什么这个简单的存储过程不起作用

时间:2017-10-24 02:55:02

标签: sql sql-server stored-procedures subquery

这是交易,我从C#收到一个数组,我想将它插入下表,只有2列@idUser int@idRegion int

存储过程需要接收数组并将其插入到表中但不知何故它不起作用,它告诉我它无法将@idRegion转换为int。我尝试使用CASTCONVERT将其转换为int,但它不起作用。

Select From正常,但不是插入。

以下是存储过程(@idUser对于所有插入的行必须相同):

    @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

运行时出现此错误:

  

转换nvarchar值时转换失败' 1,2,3,4'数据类型int。

2 个答案:

答案 0 :(得分:2)

如果要在@idRegion中发送多个值,那么在拆分它们时,可能需要插入多个项目。因此,这样做:

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

如果目标表的IdRegion列的类型为int,则需要像这样投射:

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

以上代码将为每条记录插入相同的@idUser,但根据拆分的项目为IdRegion插入不同的值。更多关于Insert into select from

答案 1 :(得分:0)

您的INSERT语句似乎与IdRegion一起使用,而其他所有内容都是小写的id

但是,假设这是实际表列的命名方式,而不是拼写错误...

您的问题很可能是以下行: @idRegion nvarchar(MAX)
这是将@idRegion变量声明为字符串,而你在问题中声明它意味着是一个int。 这可以解释投射错误。

如果你不能将它作为C#代码中的int传递给过程。你唯一的另一个选择就是尝试将它解析成一个int,就像你说的那样。