从SQL Server 2000到2005的INSERT?

我有一个应用程序(当前)需要使用由SQL Server 2000和SQL Server 2005提供服务的数据库。

我试图从一台服务器上以编程方式移动数据库到另一台服务器。 我使用的每个表都有一个自动增加的主键。 由于这些自动增量密钥用作其他表中的外键,因此我对复制表的攻击计划是暂时关闭目标表上的自动增量,逐字(使用原始主键)插入记录,然后将自动再次增加。

如果我理解正确,我可以通过执行一次一个表“开启/关闭自动增量”

SET IDENTITY_INSERT tbl_Test ON;
...
SET IDENTITY_INSERT tbl_Test OFF;

我的实现是在VB 2005中使用System.Data.SqlClient。

为了简洁起见,我只会显示与构建SQL查询相关的代码行。

要创建表格:

    Dim createTableStatement As String = _
        "CREATE TABLE tbl_Test (" & _
            "ID_Test INTEGER PRIMARY KEY IDENTITY," & _
            "TestData INTEGER" & _
            ")"
    Dim createTableCommand As New SqlCommand(createTableStatement, connection)

    createTableCommand.ExecuteNonQuery()

打开或关闭IDENTITY_INSERT:

    Dim turnOffIdentInsertStatement As String = _
        "SET IDENTITY_INSERT tbl_Test OFF;"
    Dim turnOffIdentInsertCommand As New SqlCommand(turnOffIdentInsert, connection)
    turnOffIdentInsertCommand.ExecuteNonQuery()

    Dim turnOnIdentInsertStatement As String = _
        "SET IDENTITY_INSERT tbl_Test ON;"
    Dim turnOnIdentInsertCommand As New SqlCommand(turnOnIdentInsert, connection)
    turnOnIdentInsertCommand.ExecuteNonQuery()

要正常插入新记录,无需指定主键:

    Dim insertRegularStatement As String = _
        "INSERT INTO tbl_Test (TestData) VALUES (42);"
    Dim insertRegularCommand As New SqlCommand(insertRegularStatement, connection)
    insertRegularCommand.ExecuteNonQuery()

用一个明确的主键插入新记录:

    Dim insertWithIDStatement As String = _
        "INSERT INTO tbl_Test (ID_Test, TestData) VALUES (20, 42);"
    Dim insertWithIDCommand As New SqlCommand(insertWithIDStatement, connection)
    insertWithIDCommand.ExecuteNonQuery()

因此,我的计划是调用打开IDENTITY_ INSERT的代码,使用显式主键添加记录,然后关闭IDENTITY_ INSERT。

当我与SQL Server 2000交谈时,此方法似乎正常工作,但当我尝试使用与SQL Server 2005完全相同的代码时遇到异常:

"Cannot insert explicit value for identity column in table 'tbl_Test' when IDENTITY_INSERT is set to OFF."

任何提示? 一如既往地提前致谢。


这是值得一看的SqlBulkCopy,因为它是优化导入批量数据。

另外值得关注的是,使用SSIS任务来批量复制数据(也使用批量复制API)或链接服务器与BULK INSERT语句(再次,批量复制API)。

至于设置身份是在插入相同的连接上执行的set identity_insert语句? 由于SQL Server 2005只在当前连接上保持该设置。

在SQL Server 2008 Express上,以下工作适合我:

using (var conn = CreateConnection())
{
    conn.Open();
    new SqlCommand("SET IDENTITY_INSERT Foo ON", conn).ExecuteNonQuery();
    new SqlCommand("INSERT INTO Foo(id) VALUES (1)", conn).ExecuteNonQuery();
    new SqlCommand("SET IDENTITY_INSERT Foo OFF", conn).ExecuteNonQuery();
}

您可能需要在SET IDENTITY ... ON语句之后插入GO语句。


在SQL查询分析器会话中,我会在IDENTITY_INSERT之后和实际插入之前发出GO。 也许这适用于从代码中调用它呢?

链接地址: http://www.djcxy.com/p/17131.html

上一篇: INSERT from SQL Server 2000 to 2005?

下一篇: iOS not working scroll overflow:hidden