从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