You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需修改C#代码,如何向存储过程传递string[]数组参数?

解决C#传string[]到SQL存储过程的类型转换问题

嘿,我来帮你搞定这个头疼的类型转换问题!你遇到的「Cannot convert from string[] to string」错误,本质是存储过程的参数类型和C#传的数组不匹配,而且你还不能改C#代码,那咱们就从SQL存储过程这边下手,给你两个实用的解决方案:

方案一:用表值参数(最靠谱的官方方案)

这是SQL Server专门用来接收数组类数据的标准方式,完全适配C#的string[]传递,而且不用改C#代码:

  1. 先创建一个自定义表值类型
    这个类型用来存储你的字符串数组元素,执行一次这个SQL就行:

    CREATE TYPE StringList AS TABLE (Value NVARCHAR(MAX))
    
  2. 修改你的存储过程参数
    把原来接收单个字符串的参数,换成这个表值类型的参数(记得加READONLY,表值参数必须是只读的):

    ALTER PROCEDURE YourProcedureName
        @InfoArray StringList READONLY
    AS
    BEGIN
        -- 现在你可以像操作普通表一样使用这个数组参数了,比如查询所有元素:
        SELECT Value FROM @InfoArray;
        -- 或者和业务表做关联查询,比如:
        -- SELECT * FROM YourBusinessTable WHERE ColumnName IN (SELECT Value FROM @InfoArray)
    END
    

    这样C#那边传的string[]会自动映射到这个表值参数,再也不会报类型转换错误了。

方案二:用JSON数组解析(对应你看到的Stack Overflow回答)

你看到的那个「声明@INFO_ARRAY ARRAY nvarchar(max)」其实是个简写,SQL Server本身没有原生的ARRAY类型,实际是用JSON数组来模拟数组处理。如果你的工具会自动把C#的string[]序列化成JSON格式的字符串(比如["值1","值2","值3"]),可以试试这个方法:

修改存储过程的参数为NVARCHAR(MAX),然后用OPENJSON解析成表:

ALTER PROCEDURE YourProcedureName
    @InfoJson NVARCHAR(MAX)
AS
BEGIN
    -- OPENJSON会把JSON数组转换成一行行的记录
    SELECT * FROM OPENJSON(@InfoJson) WITH (Value NVARCHAR(MAX) '$');
    -- 后续就可以用这些数据做业务逻辑了
END

不过这个方法的前提是工具会自动把string[]转成JSON字符串,如果工具没做这个,还是方案一更稳妥。

内容的提问来源于stack exchange,提问作者Liam neesan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:09:21