zoukankan      html  css  js  c++  java
  • 动态sql

    动态SQL可以通过EXECUTE 或SP_EXECUTESQL这两种方式来执行

    execute:
    可执行 系统存储过程,用户自定义存储过程,标量值用户定义函数,扩展存储过程
    sp_executesql:
    执行多次重复使用或者动态生成的sql语句或者批处理,sql语句可以包含嵌入参数
    在批处理,名称作用域或者数据库上下文中,sp_executesql 和 execute的行为相同,。

    前者比后者方便些,比如执行动态sql字符串是varchar类型,不是nvarchar类型,后者只能执行是Unicode的字符串,或者可以隐转换为ntext的常量或变量,execute则两种类型的字符串都能执行

    EXECUTE (N'SELECT * FROM Groups') --执行成功
    EXECUTE ('SELECT * FROM Groups') --执行成功

    SP_EXECUTESQL N'SELECT * FROM Groups'; --执行成功
    SP_EXECUTESQL 'SELECT * FROM Groups' --执行出错

    总结下:EXECUTE 可以执行非Unicode或Unicode类型的字符串常量、变量。而SP_EXECUTESQL只能执行Unicode或可以隐式转换为ntext的字符串常量、变量。


    EXECUTE 括号里面只能是字符串变量、字符串常量、或它们的连接组合,不能调用其它一些函数、存储过程等。 如果要使用,则使用变量组合,


    EXEC SP_EXECUTESQL @Sql, N'@GroupName NVARCHAR',@GroupName
    查询出来没有结果,因为没有声明参数长度。


    动态批处理不能访问定义在批处理里的局部变量 。 SP_EXECUTESQL 可以有输入输出参数,比EXECUTE灵活。

    SELECT cacheobjtype, objtype, usecounts, sql
    FROM sys.syscacheobjects
    WHERE sql NOT LIKE '%cache%'
    AND sql NOT LIKE '%sys.%';


    前者每次执行生成一个执行计划,然后再执行,后者只生成一次,但会重复使用,所以后者比前者效率高

  • 相关阅读:
    mysql The server time zone value 'xxx' is unrecognized
    mysql Public Key Retrieval is not allowed
    mysql Unable to load authentication plugin 'caching_sha2_password'.
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/niuzaihenmang/p/5587787.html
Copyright © 2011-2022 走看看