ling 存储过程的创建与应用方法

作者:袖梨 2022-06-29

一、  创建存储过程

使用 SQL Server Management Studio 中的对象资源管理器创建 Transact-SQL 存储过程:

在对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。

展开“数据库”、存储过程所属的数据库以及“可编程性”。

右键单击“存储过程”,再单击“新建存储过程”。

在“查询”菜单上,单击“指定模板参数的值”。

在“指定模板参数的值”对话框中,“值”列包含参数的建议值。接受这些值或将其替换为新值,再单击“确定”。

在查询编辑器中,使用过程语句替换 SELECT 语句。

若要测试语法,请在“查询”菜单上,单击“分析”。

若要创建存储过程,请在“查询”菜单上,单击“执行”。(将定义的存储过程保存)

若要保存脚本,请在“文件”菜单上,单击“保存”。接受该文件名或将其替换为新的名称,再单击“保存”。

二、采用Bulk Insert创建存储带参数过程示例:

 

 代码如下 复制代码

SET ANSI_NULLS ON
  GO
  SET QUOTED_IDENTIFIER ON
  GO
  -- =============================================
  -- Author:  Jiarin
  -- Create date:
  -- Description: Bulk Insert CaliData
  -- =============================================
  CREATE PROCEDURE spBulkInsertCaliData
   -- Add the parameters for the stored procedure here


   @tbName nvarchar(50),

   @fileName nvarchar(255)
  AS
  BEGIN
   -- SET NOCOUNT ON added to prevent extra result sets from
   -- interfering with SELECT statements.
   SET NOCOUNT ON;
 

   -- Insert statements for procedure here
   Exec('BULK INSERT ' + @tbName + ' FROM '''+ @fileName + '''
    WITH (FIELDTERMINATOR ='','',ROWTERMINATOR = ''n'')');
  END
  GO

注意:上面表名与文件名的区别


三、调用存储过程

 代码如下 复制代码

  USE db_MeterMS;
  GO
  EXECUTE spBulkInsertCaliData @fileName = N'd:bbb.txt';
  GO
  SELECT * FROM tb_CaliData
  GO

四、采用SQL语句多参数调用
 

 代码如下 复制代码

SQL.Add('Exec sp_BulkInsertData :tbName , :fileName');

Parameters.ParamByName('tbName').Value := 'tb_CaliData';

Parameters.ParamByName('fileName').Value := SharedPath+''+CaliFileName;


下面看一些相关实例哦。


当存储过程可以返回多个结果形状时,返回类型无法强类型化为单个投影形状。尽管 LINQ to SQL 可以生成所有可能的投影类型,但它无法获知将以何种顺序返回它们。 ResultTypeAttribute 属性适用于返回多个结果类型的存储过程,用以指定该过程可以返回的类型的集合。

在下面的 SQL 代码示例中,结果形状取决于输入(param1 = 1或param1 = 2)。我们不知道先返回哪个投影。

 

 代码如下 复制代码
ALTER PROCEDURE [dbo].[SingleRowset_MultiShape]
     -- Add the parameters for the stored procedure here
     (@param1 int )
AS
BEGIN
     -- SET NOCOUNT ON added to prevent extra result sets from
     -- interfering with SELECT statements.
     SET NOCOUNT ON;
     if(@param1 = 1)
     SELECT * from Customers as c where c.Region = 'WA'
     else if (@param1 = 2)
     SELECT CustomerID, ContactName, CompanyName from
     Customers as c where c.Region = 'WA'
END

拖到O/R设计器内,它自动生成了以下代码段:

 

 代码如下 复制代码
[Function(Name="dbo.[Whole Or Partial Customers Set]")]
public ISingleResult
Whole_Or_Partial_Customers_Set([Parameter(DbType="Int")]
System.Nullable param1)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
    return ((ISingleResult)
    (result.ReturnValue));
}

但是,VS2008会把多结果集存储过程识别为单结果集的存储过程,默认生成的代码我们要手动修改一下,要求返回多个结果集,像这样:

 

 代码如下 复制代码
[Function(Name="dbo.[Whole Or Partial Customers Set]")]
[ResultType(typeof(WholeCustomersSetResult))]
[ResultType(typeof(PartialCustomersSetResult))]
public IMultipleResults Whole_Or_Partial_Customers_Set([Parameter
(DbType="Int")] System.Nullable param1)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
    return ((IMultipleResults)(result.ReturnValue));
}

我们分别定义了两个分部类,用于指定返回的类型。WholeCustomersSetResult类 如下:(点击展开)

 
PartialCustomersSetResult类 如下:(点击展开)

 
这样就可以使用了,下面代码直接调用,分别返回各自的结果集合。

 

 代码如下 复制代码
//返回全部Customer结果集
IMultipleResults result = db.Whole_Or_Partial_Customers_Set(1);
IEnumerable shape1 =
 result.GetResult();
foreach (WholeCustomersSetResult compName in shape1)
{
    Console.WriteLine(compName.CompanyName);
}
//返回部分Customer结果集
result = db.Whole_Or_Partial_Customers_Set(2);
IEnumerable shape2 =
 result.GetResult();
foreach (PartialCustomersSetResult con in shape2)
{
    Console.WriteLine(con.ContactName);
}

语句描述:这个实例使用存储过程返回“WA”地区中的一组客户。返回的结果集形状取决于传入的参数。如果参数等于 1,则返回所有客户属性。如果参数等于2,则返回ContactName属性。

 

这种存储过程可以生成多个结果形状,但我们已经知道结果的返回顺序。

下面是一个按顺序返回多个结果集的存储过程Get Customer And Orders。 返回顾客ID为"SEVES"的顾客和他们所有的订单。

 

 代码如下 复制代码
ALTER PROCEDURE [dbo].[Get Customer And Orders]
(@CustomerID nchar(5))
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SELECT * FROM Customers AS c WHERE c.CustomerID = @CustomerID 
    SELECT * FROM Orders AS o WHERE o.CustomerID = @CustomerID
END

 

拖到设计器代码如下:

 

 代码如下 复制代码
[Function(Name="dbo.[Get Customer And Orders]")]
public ISingleResult
Get_Customer_And_Orders([Parameter(Name="CustomerID",
DbType="NChar(5)")] string customerID)
{
     IExecuteResult result = this.ExecuteMethodCall(this,
     ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);
     return ((ISingleResult)
     (result.ReturnValue));
}

 

同样,我们要修改自动生成的代码:

 

 代码如下 复制代码
[Function(Name="dbo.[Get Customer And Orders]")]
[ResultType(typeof(CustomerResultSet))]
[ResultType(typeof(OrdersResultSet))]
public IMultipleResults Get_Customer_And_Orders
([Parameter(Name="CustomerID",DbType="NChar(5)")]
string customerID)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);
    return ((IMultipleResults)(result.ReturnValue));
}
 

同样,自己手写类,让其存储过程返回各自的结果集。

CustomerResultSet类

 
OrdersResultSet类

 
这时,只要调用就可以了。

 代码如下 复制代码
IMultipleResults result = db.Get_Customer_And_Orders("SEVES");
//返回Customer结果集
IEnumerable customer =
result.GetResult();
//返回Orders结果集
IEnumerable orders =
 result.GetResult();
//在这里,我们读取CustomerResultSet中的数据
foreach (CustomerResultSet cust in customer)
{
    Console.WriteLine(cust.CustomerID);
}

语句描述:这个实例使用存储过程返回客户“SEVES”及其所有订单。

 

5.带输出参数
LINQ to SQL 将输出参数映射到引用参数,并且对于值类型,它将参数声明为可以为 null。

下面的示例带有单个输入参数(客户 ID)并返回一个输出参数(该客户的总销售额)。

 

 代码如下 复制代码
ALTER PROCEDURE [dbo].[CustOrderTotal]
@CustomerID nchar(5),
@TotalSales money OUTPUT
AS
SELECT @TotalSales = SUM(OD.UNITPRICE*(1-OD.DISCOUNT) * OD.QUANTITY)
FROM ORDERS O, "ORDER DETAILS" OD
where O.CUSTOMERID = @CustomerID AND O.ORDERID = OD.ORDERID

总结:ling sql的存储过程与mysql,mssql存储过程大同小义了,如果大家对常用的数据存储过程比较了解这里也就不是什么难事了。

相关文章

精彩推荐