在用户登录到他的系统并打开我的程序后,他可以根据他的 Windows 用户名从数据库中查看数据(我为此编写了一个小存储过程)。
此数据来自带有临时表 (#temp) 的查询。我现在的问题是,如果很多用户使用这个程序,打开它后他们都会尝试在存储过程中构建#temp 表。这甚至可能吗?因为如果我尝试构建一个同名的 tempTable,服务器会给我一个错误。我是否必须根据登录的用户提供动态 TempTable 名称???或者还有其他更好的选择吗?MS-SQL 服务器
在用户登录到他的系统并打开我的程序后,他可以根据他的 Windows 用户名从数据库中查看数据(我为此编写了一个小存储过程)。
此数据来自带有临时表 (#temp) 的查询。我现在的问题是,如果很多用户使用这个程序,打开它后他们都会尝试在存储过程中构建#temp 表。这甚至可能吗?因为如果我尝试构建一个同名的 tempTable,服务器会给我一个错误。我是否必须根据登录的用户提供动态 TempTable 名称???或者还有其他更好的选择吗?MS-SQL 服务器
#TableName
每个会话/连接都有一个本地临时表(一个)因此,存储过程中的本地临时表对于可能的并发用户是安全的
另一方面,您使用全局临时表 ( ##TableName
) 然后它对 world+dog 可见
来自MSDN(我的粗体)
有两种类型的临时表:本地和全局。本地临时表仅在与 SQL Server 实例首次创建或引用表时相同的连接期间对其创建者可见。用户断开与 SQL Server 实例的连接后,本地临时表将被删除。全局临时表在创建后对任何用户和任何连接都是可见的,并在引用该表的所有用户与 SQL Server 实例断开连接时被删除。
如果它是存储过程 (SP) 中的真正临时表,则临时表在 SP 执行期间创建/仅存在。如果 sp 由多个用户同时运行多次,则临时表会被多次创建并存储在每个用户自己的内存空间中。
返回给每个用户的结果将是唯一的,并且临时表的每个副本都不会从其他 sp 调用中看到临时表。
如果您通过两次创建临时表在查询窗口中进行测试,那么您将收到错误消息。
为了证明上述工作安排 SP 运行两次,同时传递不同的用户 ID。您将获得两个不同的结果集。