【问题标题】:Handling insert and delete with multiple users in SQL在 SQL 中处理多个用户的插入和删除
【发布时间】:2016-01-25 13:32:03
【问题描述】:

我想维护一个使用 ADO 方法通过 Excel 将数据上传到 SQL Server 的系统。该过程包括两个步骤:

  1. 原始数据被插入到临时表中,比如dbo.TableTemp
  2. 原始数据通过存储过程处理并插入到dbo.GoodTable
  3. delete from dbo.TableTemp 在存储过程结束时

有什么方法可以确保两个用户的活动不重叠?比如user1的delete from dbo.TableTemp在user2插入数据之后,数据处理之前不会被执行?

更新。不幸的是,我没有成功使用#temp 表。它们似乎太临时了,当我尝试将数据插入其中时,#temps 已经不存在了。为了上传数据,我使用了 Sergey Vaselenko 从这里下载的代码变体:http://www.excel-sql-server.com/excel-sql-server-import-export-using-vba.htm#Excel Data Export to SQL Server using ADO

在 Sergey 的解决方案中,可以在步骤 1 中插入数据之前通过存储过程创建表。但是当我使用存储过程创建 #temp 表时,它会在过程结束时消失,所以我无法插入数据给它。请问有什么帮助吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用temporary tables#TableTemp。这些是针对每个会话的,因此不会重叠。

    有两种类型的临时表:本地和全局。他们不同 在他们的名字,他们的知名度和他们的 可用性。本地临时表有一个单一的数字符号 (#),如 他们名字的第一个字符;它们仅对 用户的当前连接,当用户被删除时 与 SQL Server 实例断开连接。全局临时表 有两个数字符号(##)作为他们名字的第一个字符; 它们在创建后对任何用户都是可见的,并且它们是 当所有引用该表的用户都与该表断开连接时删除 SQL Server 实例。

    更新。 看起来这个特殊的Excel-SQL Server Import-Export using VBA 使用单独的函数来创建表并上传每个打开和关闭自己的连接的数据。从 SQL Server 的角度来看,这些函数在不同的会话中运行,因此临时表不会持续存在。我认为这个解决方案可以重写为使用单连接来创建临时表、填充、处理数据并将结果输出到永久表中。

    您可能还会发现这个问题很有用:How do I make an ADODB.Connection Persistent in VBA in Excel? 特别是 - Kevin Pope 的回答建议使用工作簿本身打开和关闭的全局连接变量:

    Global dbConnPublic As ADODB.Connection
    

    在“ThisWorkbook”对象中:

    Private Sub Workbook_Open()
        Set dbConnPublic = openDBConn() 'Or whatever your DB connection function is called
    End Sub
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        dbConnPublic.Close
    End Sub
    

    【讨论】:

      【解决方案2】:

      另一种方法 - 使用 TABLE 变量。 From MSDN

      CREATE @AddedValues TABLE (ID INT, SomeValue VARCHAR(50))
      

      然后通常将其用作查询中的表。

      INSERT INTO @AddedValues (ID, SomeValue) VALUES (1, 'Test');
      
      SELECT ID FROM @AddedValues WHERE SomeValue = 'Test';
      

      表变量的范围仅限于批次。因此,您可以确保其他用户甚至同一用户不会从另一批次访问它。

      来自 MSDN

      表变量的行为类似于局部变量。它有一个明确的 范围。这是函数、存储过程或批处理 声明。

      【讨论】:

        【解决方案3】:

        您可以将它放在临时数据库中,而不是在用户数据库中使用临时表。在 CREATE TABLE 语句中使用 # 前缀表名以在 tempdb 中创建它。

        例如

        CREATE TABLE #TableTemp (....)
        

        只有创建临时表的会话才能访问它,SQL Server 会自动删除该表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 2023-02-08
          • 1970-01-01
          相关资源
          最近更新 更多