时间:2021-07-01 10:21:17 帮助过:25人阅读
- <span style="color: #008080">--</span><span style="color: #008080">=**********************************************</span><span style="color: #008080">
- --</span><span style="color: #008080">为什么我执行下面的语句选不到正确数据</span>
- <span style="color: #0000ff">CREATE</span> <span style="color: #0000ff">PROC</span><span style="color: #000000"> p
- (
- </span><span style="color: #008000">@field</span> <span style="color: #0000ff">VARCHAR</span>(<span style="color: #800000; font-weight: bold">10</span>),<span style="color: #008080">--</span><span style="color: #008080">字段名</span>
- <span style="color: #008000">@value</span> <span style="color: #0000ff">VARCHAR</span>(<span style="color: #800000; font-weight: bold">10</span>) <span style="color: #008080">--</span><span style="color: #008080">值</span>
- <span style="color: #000000">)
- </span><span style="color: #0000ff">AS</span>
- <span style="color: #0000ff">SELECT</span> <span style="color: #808080">*</span> <span style="color: #0000ff">FROM</span> tb <span style="color: #0000ff">WHERE</span> <span style="color: #008000">@field</span><span style="color: #808080">=</span><span style="color: #008000">@value</span>
- <span style="color: #0000ff">GO</span>
- <span style="color: #0000ff">EXEC</span> p <span style="color: #ff0000">‘</span><span style="color: #ff0000">v</span><span style="color: #ff0000">‘</span>,<span style="color: #ff0000">‘</span><span style="color: #ff0000">a</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">GO</span>
- <span style="color: #0000ff">DROP</span> <span style="color: #0000ff">PROC</span><span style="color: #000000"> p
- </span><span style="color: #008000">GO</span>
上面的proc执行正确
为什么我执行下面语句报错
- <span style="color: #0000ff">CREATE</span> <span style="color: #0000ff">PROC</span><span style="color: #000000"> p
- (
- </span><span style="color: #008000">@table</span> <span style="color: #0000ff">VARCHAR</span>(<span style="color: #800000; font-weight: bold">10</span>),<span style="color: #008080">--</span><span style="color: #008080">表名</span>
- <span style="color: #008000">@value</span> <span style="color: #0000ff">VARCHAR</span>(<span style="color: #800000; font-weight: bold">10</span>) <span style="color: #008080">--</span><span style="color: #008080">值</span>
- <span style="color: #000000">)
- </span><span style="color: #0000ff">AS</span>
- <span style="color: #0000ff">SELECT</span> <span style="color: #808080">*</span> <span style="color: #0000ff">FROM</span> <span style="color: #008000">@table</span> <span style="color: #0000ff">WHERE</span> v<span style="color: #808080">=</span><span style="color: #008000">@value</span>
说明:
在这二个存储过程中,@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赋值。
这样,也就产生了递规查询变量:"
T-SQL常见基础疑点问答总结
标签:weight tab 数据查询 取值 blog exe 未定义 记录 执行