使用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。

  二、测试概述

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

  

  三、准备数据

  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的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试。

Sql2008中使用DataTable作为存储过程的参数的更多相关文章

  1. sql 解析字符串添加到临时表中 sql存储过程in 参数输入

    sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneCol ...

  2. java 实现往oracle存储过程中传递array数组类型的参数

    注:本文来源于 <  java 实现往oracle存储过程中传递array数组类型的参数  >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...

  3. C#存储过程 传入参数 传出参数 结果集

    作者:卞功鑫 转载请保留:http://www.cnblogs.com/BinBinGo/p/6400928.html //1 连接字符串 string connectionString = &quo ...

  4. SQL Server将DataTable传入存储过程(Table Value Parameter)

    博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 SQL Server 数据库是不支持数组类型变量的,想要实现数组的功能,可以通过 XML 和数据表的方法实现,但是实现方法非常 ...

  5. SQL Server 存储过程 数组参数 (How to pass an array into a SQL Server stored procedure)

    Resource from StackOverflow 使用存储过程,如何传递数组参数? 1.分割解析字符串,太麻烦 2.添加Sql Server 自定义类型 sp_addtype 问题需求:需要向S ...

  6. PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

    (转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...

  7. 在DataTable中执行DataTable.Select("条件")返回DataTable;

    转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...

  8. SQL 中常见的系统存储过程

    -- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_logi ...

  9. 在DataTable中执行DataTable.Select("条件")

     .在DataTable中执行DataTable.Select("条件")返回DataTable:  // <summary> // 执行DataTable中的查询返回 ...

随机推荐

  1. uva 1203 - Argus

    简单的优先队列的应用: 代码: #include<queue> #include<cstdio> using namespace std; struct node { int ...

  2. SecureCRT 颜色

    默认的情况下,SecureCRT 是没有颜色方案的. 也就是说:用vim,你是看不到色彩显示效果,用ll 文件和文件夹也不会有颜色区别.  那如何支持颜色显示呢?方法如下:  www.2cto.com ...

  3. bzoj1853 bzoj2393

    两题是类似的,这里说一下bzoj1853 首先我们求出所有的幸运号码,注意如果存在x是y的倍数则x不算在内,避免之后重复计算 下面我们就要统计幸运号码的倍数了,这显然是要用到容斥原理的 但是幸运号码很 ...

  4. MyEclipse 设置字体

    过了好几年,又开始用myeclipse  都忘了,  这里贴图用于记录 1.打开window - preferences . 2.打开General-Appearance-Colors and Fon ...

  5. 把测试app打包成ipa文件

    我终于把我的程序放到我的touch上了,其实把app放到touch上还有很多办法,这篇教程是主要讲怎么把app注册了,然后打包成一个ipa文件的. 先上官方文档:https://developer.a ...

  6. JavaScript高级程序设计20.pdf

    用户代理检测 为了不在全局作用域中添加多余的变量,我们使用模块增强模式来封装检测脚本 以下是完整的用户代理字符串检测脚本,包括检测呈现引擎.平台.Window操作系统.移动设备和游戏系统 var cl ...

  7. Linux process state codes

    Here are the different values that the s, stat and state output specifiers (header "STAT" ...

  8. MySQL可视化管理工具 —— Navicat for MysSQL

    类似PL/SQL管理Oracle的工具 Navicat可以管理MySQL 1.安装 2.连接(输入IP.端口.用户名.密码) 3.新建sql语句:点击左侧database.点击菜单“查询”.点击“新建 ...

  9. hud1856 并查集

    Problem Description Mr Wang wants some boys to help him with a project. Because the project is rathe ...

  10. Google Reader的另一个开源的替代品Go Read

    Google Reader到7月1号退休了,于是出现了一批Google Reader的替代品,比如Google Reader Is Shutting Down; Here Are the Best A ...