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

Haskell中如何调用带有表类型参数的SQL Server存储过程

首先明确结论:Haskell完全支持调用带表类型参数的SQL Server存储过程。你可以通过odbc库(Haskell生态中专门对接SQL Server等支持ODBC协议数据库的成熟库)实现这一需求,具体操作如下:

前置准备

  • 本地安装支持表值参数的SQL Server ODBC驱动,推荐使用ODBC Driver 17 for SQL Server及以上版本
  • 你的Haskell项目中引入odbc、text作为依赖

实现代码示例

{-# LANGUAGE OverloadedStrings #-}

import Database.ODBC.SQLServer
import Data.Text (Text)

-- 定义和SQL Server自定义表类型对应的Haskell数据结构
data Category = Category
  { categoryId :: Int
  , categoryName :: Text
  } deriving (Show, Eq)

-- 将Category实例转换为ODBC库可识别的行数据格式
categoryToOdbcRow :: Category -> [Value]
categoryToOdbcRow cat = [
    IntValue (categoryId cat),
    TextValue (categoryName cat)
  ]

main :: IO ()
main = do
  -- 替换为你自己的数据库连接信息
  let connStr = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=你的数据库地址;DATABASE=你的库名;UID=登录账号;PWD=登录密码;Encrypt=no"
  conn <- connect connStr

  -- 构造待插入的批量分类数据
  let insertData = [
        Category 1 "数码产品",
        Category 2 "纸质图书",
        Category 3 "家居用品"
      ]
      -- 构造表值参数,依次传入自定义表类型全称、列名列表、行数据列表
      tableParam = TableValue 
        "dbo.CategoryTableType" 
        ["CategoryID", "CategoryName"] 
        (map categoryToOdbcRow insertData)

  -- 调用存储过程,传入构造好的表值参数
  exec conn "EXEC InsertCategories ?" [toValue tableParam]

  -- (可选)查询验证插入结果
  result <- query conn "SELECT * FROM dbo.Category" []
  mapM_ print (result :: [[Value]])

  close conn

注意事项

  • 自定义表类型的名称必须和SQL Server中定义的完全一致,不可省略schema前缀(示例中为dbo.)
  • 表值参数的列顺序、数据类型必须和自定义表类型的定义严格匹配,否则会触发SQL Server类型校验错误
  • 存储过程的表类型入参必须标记READONLY,这是SQL Server对表值参数的强制要求,你当前的存储过程定义已经符合要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:00:02