SQL Server表值参数使用

本文介绍如何在SQL Server中使用表值参数,包括创建表值类型、存储过程及调用示例。从定义表值参数到实际应用,涵盖了C#调用存储过程的方法。

SQL Server自2008版本开始支持表类型的参数,可以用于存储过程、函数等,也可以直接使用C#等语言调用SQL直接查询。

首先创建一个表值类型:

设置表格参数(后面变化时不可直接修改,需要删除重建):

USE [test]
GO

-- Create the data type
CREATE TYPE dbo.type_testStruct AS TABLE 
(
	ID INT NOT NULL,
	Val DECIMAL NOT NULL, 
    PRIMARY KEY (ID)
)
GO


弄个存储过程:表值参数只能是Readonly的,不能作为output

CREATE PROC structTest
    (
        @table AS type_testStruct READONLY
    )
AS
    BEGIN

        SELECT ID ,
               Val * 2 AS Val
        FROM   @table;
    END;


测试调用存储过程:

DECLARE @table AS type_testStruct;
INSERT @table ( ID , Val ) VALUES ( 1 , 10 )
INSERT @table ( ID , Val ) VALUES ( 2 , 20 )
INSERT @table ( ID , Val ) VALUES ( 3 , 30 )

EXEC structTest @table


结果:

C#调用示例:(此示例调用另外一个过程,用法相同)

        DataTable dt = new DataTable();
        dt.Columns.Add("ID", typeof(int));
        dt.Columns.Add("Val", typeof(decimal));
        DataRow row = dt.NewRow();
        row[0] = 9;
        row[1] = 1000;
        dt.Rows.Add(row);

        DataRow row2 = dt.NewRow();
        row2[0] = 10;
        row2[1] = 2000;
        dt.Rows.Add(row2);

        var sql = "getInfoForReportByMOProcessRowIDAndQty";
        var dt2 = SqlHelper.ExecuteDataset(db.ConnectionStrings.test, CommandType.StoredProcedure, sql, new SqlParameter("values", dt)).Tables[0];

        JSONHelper.WriteJSON(dt2);

结果:

可以看到,调用时和普通参数没有太大差别,只是传的值是一个DataTable而已。

直接SQL调用,主要差别在参数要设置类型:

                    SqlParameter tablePara = new SqlParameter("values", SqlDbType.Structured);//参数的类型,SqlDbtype.Structured
                    tablePara.TypeName = "dbo.IDValueStruct"; //这个就是建立的类型名称,比如上面的type_testStruct
                    tablePara.Value = valuesTable;

其他就和普通的查询一样了

另外注意一点,C#中调用时传递的DataTable参数,要求列的顺序要和类型中表列顺序一致,列名无要求,可以和类型中的字段名称不一致。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello World,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值