上面的proc执行正确
为什么我执行下面语句报错
CREATE PROC p ( @table VARCHAR(10),--表名 @value VARCHAR(10) --值 ) AS SELECT * FROM @table WHERE v=@value
说明:在这二个存储过程中,@table,@field,@value都被定义为varchar第一个实际上执行的是两个变量的比较,它的作用相当于IF @field=@valueSELECT * 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赋值。这样,也就产生了递规查询变量:"
转载于:https://www.cnblogs.com/zoro-zero/p/6677583.html
相关资源:JAVA上百实例源码以及开源项目