我是存储过程的新手,我的应用程序要求是使用 bcp 在全局临时表和批量复制中收集数据。
我正在调用存储过程,它将数据复制到全局临时表中。当我执行存储过程时,它会引发错误
无效的对象名称“tempdb..qaw_temp”
存储过程代码:
CREATE table tempdb..qaw_temp
(id char(12),
i_test int))
print 'Before Insert'
insert into tempdb..qaw_temp
values('0411',
3077,
print 'After Insert'
如果我们从 Aqua Data Studio 执行代码,这项工作就完成了。但是当我在存储过程中执行时,它会抛出上述错误。
存储过程代码
create PROC Xtest
as
Begin
<< Code >>
End
为什么存储过程执行失败?
请帮忙,谢谢。
SQL Server 中有两种类型的临时表。本地和全球。这两者之间的区别是:-
1.局部临时表以#开头,全局临时表以##开头
2. 本地临时表只存在一个会话。全局临时表始终存在于 tempdb 中。
3. 因为本地临时表的生命是在一个会话中,所以只有会话可以查询它。多个会话可以查询全局临时表,但数据仅限于一个会话。
在您的帖子中,您正在使用表插入值(不是全局或本地临时表)。
试试下面的查询。
谢谢
就其有关全球临时表的一些陈述而言,公认的答案是不正确的。全局临时表的特点是:
它们由两个井号表示 --
##
-- 作为其名称的前两个字符(与单井号 --#
-- 用于本地临时表不同)。全局临时表就是这样:全局。它们可以由创建对象的会话之外的会话访问(与本地临时表不同)。
所有会话都可以读取和修改它们。
当创建对象的会话结束时,它们被标记为自动删除。实际
DROP
情况将发生,然后没有更多活动事务引用该对象。含义:任何在表上(甚至是 a )具有锁的会话(甚至多个会话)SELECT
仍然可以访问全局临时表,即使在原始会话结束之后,直到该锁被释放。这对于本地临时表来说不是问题,因为没有其他会话可以访问它们,因此其他会话不会对它们进行任何锁定,从而使它们保持不变。
它们在子进程中被创建并在子进程结束后继续存在于父进程中。例如:
有效,而以下:
才不是。
我正在回答我自己的问题以结束并分享问题的根本原因。
这是数据库的权限模型,在 aqua data studio 的情况下,所有操作都由一个用户在一个会话中完成。但是在存储过程执行的情况下,创建表操作由用户在一个会话中完成并在另一个会话中使用
更新
tempdb
了用户的权限并解决了问题。