最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为SQL Server 2000中没有内置类似于 split 的函数,只好自己处理,将前台数据集中的一列用逗号拆分存到一个List中,再转化为字符串传给存储过程,很是麻烦。今天看了下SQL Server 2008的新特性,发现有表变量的使用,及其将DataTable作为参数的用法,就尝试了一下,简单谈谈心得。
一、测试环境
1、Windows Server 2008 R2 DataCenter
2、Visual Studio 2008 Team System With SP1
3、SQL Server 2008 Enterprise Edition With SP1
由于是SQL Server 2008新特性,所以只能用2008。
二、测试概述
测试项目很简单,就是添加新用户
三、准备数据
1、建立数据库、表、类型、存储过程
代码
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 代码 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 |
前台搭建好表单,后台主要是一个函数:
代码
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的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
TT百科:存储过程
存储的过程可以访问或修改数据库中的数据,但并不绑定到特定的数据库或对象,这提供了许多优点。
-
SQL Server 2008将退出微软主流数据库支持
你的企业是否还在运行SQL Server 2008?请注意微软为SQL Server 2008提供的主流技术支持服务将于今年的7月8日正式结束。
-
在Oracle数据库的自定义函数中调用存储过程
在Oracle数据库的自定义函数中调用存储过程是否可行,Oracle专家Brian Peasland给出了具体的解答。
-
数据库工程师2012年3月刊:数据库2012
数据库的2012,不是末日而是新生。传统厂商纷纷发布大版本更新的数据库产品,开源技术更加强势,2012的精彩始于《数据库工程师》……