zoukankan      html  css  js  c++  java
  • 存储过程

    MSSQL为我们提供了两种动态执行SQL语句的命令。分别是EXEC和sp_executesql.

    实例代码:

    DECLARE @TableName VARCHAR(50),@Sql NVARCHAR (MAX),@OrderID INT;
      SET @TableName
    ='Orders';
      SET @OrderID
    =10251;
      SET @sql
    =

         'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = '+
         CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'
      EXEC(@sql);
    EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量。
    例如:1.EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+
               QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');
             编译报错。
            2. EXEC(@sql+@sql2+@sql3);
             编译通过。
    综上,最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了。
     EXEC除了不支持动态批处理中的输入参数外,他也不支持输出参数。
    sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。它的构成包括:代码块,参数声明部分,参数赋值部分。
    具体语法如下:
     EXEC sp_executesql

       @stmt=<statement>,--类似存储过程主体

       @params
    =<params>, --类似存储过程参数部分,声明参数类型

      
    <params assignment>--类似存储过程调用,为参数赋值,参数值要和参数顺序要一一对应,也可以通过为参数指明参数值的方式为其赋值
    代码实例:
    DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;  
          SET @TableName
    ='Orders ';
          SET @OrderID
    =10251;  
          SET @sql
    ='SELECT * FROM '+@TableName +' WHERE OrderID = @OID ORDER BY ORDERID DESC' 
          --
    注意当要对动态sql语句的表名实行参数化时,不可以如下表示:
          --
    set @sql='select * from @TableName where OrderID=@OID ORDER BY Orderid desc',
         --
    如果这样会提示必须声明标量变量@TableName,只可以如上面所写的一样,将表名@TableName作为变量名进行拼接
          EXEC sp_executesql  
                  @sql,  
                 N
    '@OID int ',  
                @OID
    = @OrderID
     
     sq_executesql的另一个与其接口有关的强大功能是,你可以使用输出参数为调用批处理中的变量返回值。利用该功能可以避免用临时表返回数据,从而得到更高效的代码和更少的重新编译。定义和使用输出参数的语法与存储过程类似。也就是说,你需要在声明参数时指定OUTPUT子句。例如,下面的静态代码简单的演示了如何从动态批处理中利用输出参数@p把值返回到外部批处理中的变量@i.
    DECLARE @sql AS NVARCHAR(12),@i AS INT;
      SET @sql
    = N' SET @p = 10';
      EXEC sp_executesql
             @sql,
            N
    '@p AS INT OUTPUT',
            @p
    = @i OUTPUT
       SELECT @i  --
    该代码返回输出10
    (以字母 N 为前缀标识 Unicode 字符串常量)
     
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    AWTK 输入事件记录与重放
    1.aiohttp的简单使用(配合asyncio模块)
    32岁阿里数据工程师辞职后:做报表3年,我发现比996还累
    我是程序员,我为自己代言
    django.middleware.cache.FetchFromCacheMiddleware 全局缓存坑
    这样做,RMAN备份速度可提高6倍!
    数据库每日一题 2020.05.25
    别被忽悠了!我来谈谈大数据平台的4个要点,你们写的都不是干货
  • 原文地址:https://www.cnblogs.com/xuezhi/p/3053180.html
Copyright © 2011-2022 走看看