【问题标题】:Why this simple stored procedure isn't working为什么这个简单的存储过程不起作用
【发布时间】:2017-10-24 02:55:02
【问题描述】:

这是交易,我从 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 时转换失败。

【问题讨论】:

    标签: sql sql-server stored-procedures subquery


    【解决方案1】:

    如果您在 @idRegion 中发送多个值,那么当您拆分它们时,您可能需要插入超过 1 个内容。因此,请这样做:

    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

    【讨论】:

    • 看起来不错,但是当我在执行 sp 时尝试手动键入字符串时仍然遇到相同的错误 将 nvarchar 值 '1,2,3,4' 转换为数据类型 int 时转换失败.
    • @Dog 如果要插入的表有一个需要转换的 int 列:SELECT @idUser, cast(value as int) FROM STRING_SPLIT(@idRegion, ',')
    • 非常感谢您的帮助,我正在尝试以下操作,但在“值”中出现错误,列名“值”无效。 SELECT @idUser, cast(value as int) FROM Viridis.dbo.Split(@idRegion,',')
    • @Dog 那么Viridis.dbo.Split(@idRegion,',') 是什么?那不是您在问题中发布的内容。我以为你在使用 STRING_SPLIT 函数,但现在你不是。用STRING_SPLIT 试试,它会起作用的。
    • 即使使用 CAST 我得到相同的结果 将 varchar 值 '1,2,3,4' 转换为数据类型 int 时转换失败。
    【解决方案2】:

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

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

    您的问题很可能是这样一行:
    @idRegion nvarchar(MAX)
    将 @idRegion 变量声明为字符串,而您在问题中已声明它应该是一个 int。 这可以解释转换错误。

    如果您无法将其作为 C# 代码中的 int 传递到过程中。您唯一的其他选择是尝试按照您所说的将其解析为 int。

    【讨论】:

    • 哦,这不是一个数字,而是一个数字数组?我刚才说的都是?恐怕这对你没有帮助...... CodingYoshi 看起来他在正确的轨道上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2011-10-25
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多