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
相关产品推荐
相关产品推荐

