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赋值。
    这样,也就产生了递规查询变量:"

  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/6677583.html
Copyright © 2011-2022 走看看