SqlServer 傲娇的表变量
我们在编写自定义函数时,难免会用到表变量,但是,表变量关联时,会发生无法识别的错误。如:
--表1
DECLARE @tbl1 TABLE
(
id int,
ftext NVARCHAR(max),
fvalue NVARCHAR(max)
)
INSERT @tbl1 (id,ftext,fvalue) VALUES ('1','text1','value1')
INSERT @tbl1 (id,ftext,fvalue) VALUES ('2','text2','value2')
INSERT @tbl1 (id,ftext,fvalue) VALUES ('3','text3','value3')
--表2
DECLARE @tbl2 TABLE
(
id int,
ftext NVARCHAR(max),
fvalue NVARCHAR(max)
)
INSERT @tbl2 (id,ftext,fvalue) VALUES ('1','text1','value1')
INSERT @tbl2 (id,ftext,fvalue) VALUES ('2','text2','value2')
INSERT @tbl2 (id,ftext,fvalue) VALUES ('3','text3','value3')
SELECT * FROM @tbl1 INNER JOIN @tbl2 ON @tbl1.id = @tbl2.id
执行上面的sql 后,我们会得到如下的消息:
消息 137,级别 16,状态 1,第 22 行
必须声明标量变量 "@tbl1"。
消息 137,级别 16,状态 1,第 22 行
必须声明标量变量 "@tbl2"。
遇到这种情况时,如何处理?做如下修改,便可以飞起来:
SELECT * FROM @tbl1 INNER JOIN @tbl2 ON [@tbl1].id = [@tbl2].id
这里,涉及到[]的用法:
方括号的作用:
1.告诉编译器,使用的字段不是预留字段。
→
2.告诉编译器,这是一个对象(视图、存储过程,表等)。