zoukankan      html  css  js  c++  java
  • T-SQL常见基础疑点问答总结

    --建立测试环境
    IF object_id('tb'IS NOT NULL
        DROP TABLE tb
    GO
     
    CREATE TABLE tb(id INT IDENTITY(1,1),v VARCHAR(10))
    GO
    INSERT tb SELECT 'a'
    UNION ALL SELECT 'b'
    INSERT tb SELECT 'x'
    UNION ALL SELECT 'z'
    GO
    --=**********************************************
    --为什么我执行下面的语句选不到正确数据
    CREATE PROC p
    (
    @field VARCHAR(10),--字段名
    @value VARCHAR(10) --
    )
    AS
        SELECT * FROM tb WHERE @field=@value
    GO
     
    EXEC p 'v','a'
    GO
    DROP PROC p
    GO

    上面的proc执行正确

    为什么我执行下面语句报错

    CREATE PROC p
    (
    @table VARCHAR(10),--表名
    @value VARCHAR(10) --
    )
    AS
        SELECT * FROM @table WHERE v=@value

    说明:
    在这二个存储过程中,@table,@field,@value都被定义为varchar
    第一个实际上执行的是两个变量的比较,它的作用相当于
    IF @field=@value
    SELECT * FROM tb
    语法未错,意思上却大错特错

    第二个实际上执行的是
    SELECT * FROM 一个字串 WHERE v=@value
    如何能从一个字串中查询结果集呢?错误的把字串当成表对象来理解.
    请记住@table是个表名,它是个字段,而非表对象,不是object

    (2)为什么我在执行一个批语句(可能是存储过程,
          也可能是个FUNCTION,也可能只是几条语句的组合)时,
          提示错误,我照着提示的错误,检查,但是那里没有报错啊

    --=**********************************************
    比如,上面的第二个存储过程,@table明明是存储过程的输入参数,它为什么提示我@table未定义
    在上面,我已经讲了这句为什么出错的原因,
    当然@table如果是表变量的话,那么那句select是不会有问题的,
    但表变量不能用做输入参数。但它为什么这样提示呢?
    这与sql内部机制有关,sql查询语句执行前先由命令解析器进行语法检查,如果语法检查未通过,
    会扔出错误信息(通常这里的提示是精确的),
    当语法检查通过,则将其编译为可执行的内部格式(查询树),
    而非语法错误时,因为是执行时报错,执行期间是内部格式代码,只能扔出个大致错误信息.
    了解了这一点,当您的sql语句报错后,先检查是否语法错误,
    如果不是,那么需要仔细检查了,因为按着错误提示去找,很有可能兜圈子。

    说明
    SELECT 变量=字段 FROM tb
    这种赋值与SET赋值的主要区别:
    a, SET赋值,一次只能给一个变量赋值,而SELECT 则可多个
    b, SET赋值语义更明确,是赋值。而SELECT 可能是赋值也可能是数据查询
    c, 最重要的一个,SELECT 可以从表中取值,而SET不能。
    说到这有人会说 SET @v=(SELECT TOP 1 v FROM tb) 也可以,
    这样确实可以,但实际上它还是调用SELECT来完成.
    d, SELECT赋值时是滚动赋值(或许用词不科学),我来说明一下我的'滚动赋值'指的什么
    即,当SELECT v FROM tb有多个结果时,
    SELECT @v=v FROM tb 在产生结果集的过程中,每得到一条记录,
    @v都被赋一次值,也就是说,语句会滚动结果集,每次都对@v赋值。
    这样,也就产生了递规查询变量:"

  • 相关阅读:
    springmvc与servlet初识理解2
    springMVC与servlet的初识
    SpringMVC的依赖和视图解析器配置
    【内网渗透】— 内网信息收集(4)
    机械行业设计软件学习资源整理
    整理的电学课程
    redis src 目录组织结构
    解决Joi报错TypeError: Joi.Validate is not a function问题
    浅谈Node.js开发Web服务器
    JavaScript水仙花数(传递任意n位数)
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/6677583.html
Copyright © 2011-2022 走看看