SQL Server 2008中使用DataTable作为存储过程的参数

数据库 SQL Server
本文我们主要介绍了SQL Server 2008中使用DataTable作为存储过程的参数的相关知识,并通过一个一个实际的例子进行测试,希望能够对您有所帮助。

SQL Server 2008中使用DataTable作为存储过程的参数的相关知识是本文我们主要要介绍的内容,笔者在最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为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。

二、测试概述

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

SQL Server 2008中使用DataTable作为存储过程的参数

三、准备数据

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

代码:

  1. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Users]') AND type in (N'U'))  
  2. DROP TABLE [dbo].[Users]  
  3. CREATE TABLE [dbo].[Users](  
  4.  [UserID] [int] IDENTITY(-1,-1) NOT NULL,  
  5.  [UserName] [varchar](20) NOT NULL,  
  6.  [UserPass] [varchar](20) NOT NULL,  
  7.  [Sex] [bit] NULL,  
  8.  [Age] [smallint] NULL,  
  9.  CONSTRAINT [PK_Users_UserID] PRIMARY KEY CLUSTERED   
  10. (  
  11. [UserID] ASC  
  12. )WITH (PAD_INDEX  = OFFSTATISTICS_NORECOMPUTE  = OFFIGNORE_DUP_KEY = OFFALLOW_ROW_LOCKS  = ONALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
  13. ) ON [PRIMARY]  
  14.  
  15. IF  EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'UserTable' AND ss.name = N'dbo')  
  16. DROP TYPE [dbo].[UserTable]  
  17. CREATE TYPE [dbo].[UserTable] AS TABLE(  
  18.  [UserName] [varchar](20) NOT NULL,  
  19.  [UserPass] [varchar](20) NOT NULL,  
  20.  [Sex] [bit] NULL,  
  21.  [Age] [smallint] NULL  
  22. )  
  23.  
  24. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_InsertSingleUser]') AND type in (N'P', N'PC'))  
  25. DROP PROCEDURE [dbo].[sp_InsertSingleUser]  
  26. GO  
  27. CREATE PROCEDURE [dbo].[sp_InsertSingleUser]   
  28. (   
  29. @User UserTable READONLY   
  30. )   
  31. AS   
  32. SET XACT_ABORT ON   
  33. BEGIN TRANSACTION   
  34. INSERT INTO dbo.Users(UserName, UserPass, Sex, Age)   
  35. SELECT UserName, UserPass, Sex, Age FROM @User   
  36. COMMIT TRANSACTION   
  37. 前台搭建好表单,后台主要是一个函数:  
  38.  
  39. 代码  
  40.  
  41. public void fnInsertSingleUser(DataTable v_dt)   
  42. {   
  43. try   
  44. {   
  45. SqlConnection cn = new SqlConnection(CONN);   
  46. SqlCommand cmd = cn.CreateCommand();   
  47. cmd.CommandType = CommandType.StoredProcedure;   
  48. cmd.CommandText = @"sp_InsertSingleUser";   
  49. SqlParameter p = cmd.Parameters.AddWithValue("@User", v_dt);   
  50.  
  51. DataSet ds = new DataSet();   
  52. SqlDataAdapter da = new SqlDataAdapter(cmd);   
  53. da.Fill(ds);   
  54. }   
  55. catch (Exception ex)   
  56. {   
  57. throw ex;   
  58. }   

点击【添加】按钮时调用存储过程。测试是完成了,也很简单,传递一个DataTable做参数确实很方便吧,能够轻松完成原先需要很多编码的工 作。关于表变量还是有些道道的,如创建时判断其是否存在的语句,删除表变量前需要先删除引用表变量的存储过程等。

一般开发我大多会选择用临时表,处理起来 比较方便,表变量可以作为存储过程参数确实是一个独特的优势,希望在SQL Server的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试。

关于SQL Server 2008数据库中使用DataTable作为存储过程的参数的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. SQL Server 2005导入Oracle 10g的C#源码
  2. SQL Server 2008快速清理日志文件的代码
  3. SQL Server 2008数据库中CDC的功能使用及说明
  4. SQL Server 2008阻止保存要求重新创建表的更改的问题
  5. SQL Server数据库row_number() over() 来自动产生行号
责任编辑:赵鹏 来源: 百度空间
相关推荐

2010-11-12 09:18:13

SQL Server存

2011-09-01 15:24:22

SQL Server 存储过程调试

2009-08-04 10:29:06

在C#中使用存储过程

2010-09-14 10:16:57

sql server

2011-08-29 18:02:29

SQL Server FileStream

2010-07-15 12:38:14

SQL Server存

2011-09-01 17:25:03

SQL Server 查看死锁存储过程

2010-07-13 10:35:20

SQL Server2

2011-03-24 13:38:47

SQL Server 存储分页

2011-09-01 14:00:11

SQL Server 存储过程显示表结构

2021-02-08 11:04:21

嵌套SQL Server语言

2011-08-11 09:49:33

SQL Server 存储过程插入更新数据

2011-08-24 16:56:54

OracleArray类型存储过程

2010-09-06 11:05:05

SQL SERVER语句

2010-10-20 16:17:17

SQL Server角

2009-08-06 16:44:06

2010-09-27 16:10:42

SQL Server游

2010-11-10 13:03:15

SQL Server存

2009-04-16 17:38:24

SQL Server 空间数据智能

2011-08-15 15:56:31

SQL Server
点赞
收藏

51CTO技术栈公众号