使用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. Warm up 2

    hdu4619:http://acm.hdu.edu.cn/showproblem.php?pid=4619 题意:题目大意:给你两种纸牌 ,一种水平放置共有n张 ,一种竖直放置共有m张.水平放置的纸 ...

  2. I2C总线之(一)---概述

    概述: I²C 是Inter-Integrated Circuit的缩写,发音为"eye-squared cee" or "eye-two-cee" , 它是一 ...

  3. PendingIntent的Flags

    PendingIntent是一个Intent的描述.包装,给予了这个PendingIntent 的组件在指定的事件发生或指定的时间到达时启动Activty.Service或者Broadcast. 根据 ...

  4. java线程:Atomic(原子的)

    一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic是指不能分割成若干部分的意思.如果一段代码被认为是Atomic,则表示这段代码在执行过程中 ...

  5. Qt新建项目No valid kits found解决思路

    Qt新建项目No valid kits found解决思路 第一次用Qt Creator创建Project时,进入Kit Selection窗口后,会提示No Valid kits found. Pl ...

  6. 大脑提取每一个体素26领域的matlab代码

    %-------------- outer loop for x= 1:40 for y =1:48 for z =1:34 %----------inter loop x=20; y=30; z=1 ...

  7. 【转】微信Android SDK示例代码及运行方法

    原文网址:http://blog.csdn.net/icyfox_bupt/article/details/23742217 最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一 ...

  8. MYSQL删除以数字开头的字段

    例子: // 删除以0开头的字段 DELETE FROM `week_energy_copy` WHERE openid like '0%'; // 删除以数字开头的字段 DELETE FROM `w ...

  9. 获得当前屏幕的CGRect

    CGRect mainScreen = [[UIScreen mainScreen] bounds];

  10. centos 6安装报错

    Missing ISO image The installer has tried to . but cannot find it on the hard drive. Please copy thi ...