博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用DataTable作为存储过程的参数
阅读量:7027 次
发布时间:2019-06-28

本文共 2375 字,大约阅读时间需要 7 分钟。

最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为
SQL Server 2000
中没有内置类似于
split
的函数,只好自己处理,将前台数据集中的一列用逗号拆分存到一个
List<string>
中,再转化为字符串传给存储过程,很是麻烦。今天看了下
SQL Server 2008
的新特性,发现有表变量的使用,及其将
DataTable
作为参数的用法,就尝试了一下,简单谈谈心得。

 

 

一、测试环境

1Windows Server 2008 R2 DataCenter

2Visual Studio 2008 Team System With SP1

3SQL Server 2008 Enterprise Edition With SP1

由于是SQL Server 2008新特性,所以只能用2008

 

 二、测试概述

测试项目很简单,就是添加新用户

1.jpg

 

 

三、准备数据

1、建立数据库、表、类型、存储过程

 

ExpandedBlockStart.gif
代码
 1 
IF
 
NOT
 
EXISTS
(
SELECT
 
*
 
FROM
 dbo.sysobjects 
WHERE
 id 
=
 
OBJECT_ID
(
'
Users
'
AND
 
OBJECTPROPERTY
(id, N
'
IsUserTable
'
=
 
1
)
 2 
BEGIN
 3 
 
CREATE
 
TABLE
 dbo.Users
 4 
 (
 5 
  UserID 
INT
 
IDENTITY
(
-
1
-
1
NOT
 
NULL
,
 6 
  UserName 
VARCHAR
(
20
NOT
 
NULL
,
 7 
  UserPass 
VARCHAR
(
20
NOT
 
NULL
,
 8 
  Sex 
BIT
 
NULL
,
 9 
  Age 
SMALLINT
 
NULL
,
10 
  
CONSTRAINT
 PK_Users_UserID 
PRIMARY
 
KEY
(UserID)
11 
 )
12 
END
13 
IF
 
NOT
 
EXISTS
(
SELECT
 
*
 
FROM
 sys.table_types 
WHERE
 name 
=
 
'
UserTable
'
 
AND
 is_user_defined 
=
 
1
)
14 
BEGIN
15 
 
CREATE
 TYPE UserTable 
AS
 
TABLE
16 
 (
17 
  UserName 
VARCHAR
(
20
NOT
 
NULL
,
18 
  UserPass 
VARCHAR
(
20
NOT
 
NULL
,
19 
  Sex 
BIT
 
NULL
,
20 
  Age 
SMALLINT
 
NULL
21 
 )
22 
END
23 
GO
24 
ExpandedBlockStart.gif
代码
 1 
IF
 
EXISTS
(
SELECT
 
*
 
FROM
 dbo.sysobjects 
WHERE
 id 
=
 
OBJECT_ID
(
'
sp_InsertSingleUser
'
AND
 
OBJECTPROPERTY
(id, N
'
IsProcedure
'
=
 
1
)
 2 
BEGIN
 3 
    
DROP
 
PROCEDURE
 dbo.sp_InsertSingleUser
 4 
END
 5 
GO
 6 
CREATE
 
PROCEDURE
 dbo.sp_InsertSingleUser
 7 
(
 8 
    
@User
 UserTable READONLY
 9 
)
10 
AS
11 
12 
SET
 XACT_ABORT 
ON
13 
BEGIN
 
TRANSACTION
14 
15 
INSERT
 
INTO
 dbo.Users(UserName, UserPass, Sex, Age)
16 
SELECT
 UserName, UserPass, Sex, Age 
FROM
 
@User
17 
18 
COMMIT
 
TRANSACTION
19 
SET
 XACT_ABORT 
OFF
20 
GO

前台搭建好表单,后台主要是一个函数:

ExpandedBlockStart.gif
代码
 1 
    
public
 
void
 fnInsertSingleUser(DataTable v_dt)
 2 
    {
 3 
        
try
 4 
        {
 5 
            SqlConnection cn 
=
 
new
 SqlConnection(CONN);
 6 
            SqlCommand cmd 
=
 cn.CreateCommand();
 7 
            cmd.CommandType 
=
 CommandType.StoredProcedure;
 8 
            cmd.CommandText 
=
 
@"
sp_InsertSingleUser
"
;
 9 
            SqlParameter p 
=
 cmd.Parameters.AddWithValue(
"
@User
"
, v_dt);
10 
11 
            DataSet ds 
=
 
new
 DataSet();
12 
            SqlDataAdapter da 
=
 
new
 SqlDataAdapter(cmd);
13 
            da.Fill(ds);
14 
        }
15 
        
catch
 (Exception ex)
16 
        {
17 
            
throw
 ex;
18 
        }
19 
    }

  点击【添加】按钮时调用存储过程。测试是完成了,也很简单,传递一个DataTable做参数确实很方便吧,能够轻松完成原先需要很多编码的工 作。关于表变量还是有些道道的,如创建时判断其是否存在的语句,删除表变量前需要先删除引用表变量的存储过程等。一般开发我大多会选择用临时表,处理起来 比较方便,表变量可以作为存储过程参数确实是一个独特的优势,希望在SQL Server的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试:)

转载于:https://www.cnblogs.com/zhangchenliang/archive/2011/05/19/2050752.html

你可能感兴趣的文章
聚焦 SQL 数据库活动异地复制
查看>>
VS2010 开发 Office Addin插件(VS2019预览版,支持office365,也可以实现,流程一样,安装好office开发模板就可以)...
查看>>
Jquery 学习
查看>>
hdu 1251 统计难题
查看>>
UVA 10820 Send a Table
查看>>
poj 1776 Task Sequences
查看>>
bzoj千题计划249:bzoj5100: [POI2018]Plan metra
查看>>
WCF REST系列文章汇总(共9篇)
查看>>
加拿大的mcgill大学的通信与信号处理实验室相关资料
查看>>
学习网址
查看>>
HtmlAgilityPack 之 HtmlNode类
查看>>
从小白开始
查看>>
动手实操 | 作为一名美女设计师,她用 6 小时写了个上传七牛云的桌面客户端...
查看>>
[从hzwer神犇那翻到的模拟赛题] 合唱队形
查看>>
Bzoj3653 谈笑风生
查看>>
定制化WinPE
查看>>
C++ Template Metaprogramming.Chapter 1
查看>>
VUE中引入vue-awesome-swiper 不自动播放的问题
查看>>
linux在二进制文件中查找pattern的offset
查看>>
【洛谷 p3373】模板-线段树 2(数据结构--线段树)
查看>>