将记录从一个数据库复制到另一个数据库(Teradata到SQL Server)

时间:2014-11-05 21:20:55

标签: sql-server vb.net ado.net teradata sql-insert

我有一个项目,我需要查询Teradata数据库,然后将返回的记录复制到SQL Server数据库。我可以点击Teradata db没问题,我可以将结果输入DataTable。 SQL服务器db已经设置并且具有与Teradata结果相同的列(自动id列除外)。我无法弄清楚如何获取DataTable中的记录并将它们插入到SQL服务器数据库中。

以下是我对一些伪代码的看法,我并不认为这些细节是相关的:

        Using cn As New TdConnection("User Id=XYZ12345;Password=XYZ12345;Data Source=teradataserver.company.com;Persist Security Info=False")
            cn.Open()

            Dim cmd As TdCommand = cn.CreateCommand()

            'build the SELECT part of the command we will issue
            cmd.CommandText = GetTeradataSqlString()

            'setup the DataAdapter
            Dim da As New TdDataAdapter(cmd)

            ' Provider specific types will be used in the data table 
            da.ReturnProviderSpecificTypes = False 'True=Use Teradata types, False=Use .NET types

            ' Adapter will determine how many statements will be batched
            da.UpdateBatchSize = 0

            Dim cb As New TdCommandBuilder(da)

            'create a DataTable to hold our returned data
            Dim dtCheck As New DataTable("TableCheck")
            ' Filling the data table with data retrieved from the select statement 
            da.Fill(dtCheck)

            'create a DataSet to hold all of our tables
            Dim dsMain As New DataSet("MainDataset")

            'now we add the DataTable to our DataSet
            dsMain.Tables.Add(dtCheck)

            'at this point a cycle through the DataTable to the debug window shows we have the data we need from the Teradata db.

            'now we will pump it into our SQL server database
            Dim connSqlSvr As New System.Data.SqlClient.SqlConnection
            connSqlSvr.ConnectionString = "Data Source=DestSqlServer;Initial Catalog=DestDb;Connect Timeout=15"
            connSqlSvr.Open()

            'now we create a SQL command to take the data in the Teradata DataTable and insert it into the SQL server table
            Dim sqlCmd As New SqlCommand
            With sqlCmd
                .CommandType = CommandType.Text

                Dim sbSqlCmd As New StringBuilder
                sbSqlCmd.AppendLine("INSERT INTO [DestDb].[dbo].[Events] ([CityCode],[CarNum],[VIN],[Fleet],[EventItm])")
                sbSqlCmd.AppendLine("SELECT City,CarNo,VIN,Fleet,EventDesc FROM @MyTable;")
                .CommandText = sbSqlCmd.ToString
                Dim sqlParam As New SqlParameter
                sqlParam.ParameterName = "@MyTable"
                sqlParam.SqlDbType = SqlDbType.Structured
                sqlParam.Value = dtCheck
                sqlParam.TypeName = "TableCheck"
                .Parameters.Add(sqlParam)

                .Connection = connSqlSvr

                Dim rowsAffectedLoad As Integer = .ExecuteNonQuery()
                debug.print(rowsAffectedLoad & " rows were loaded into the SQL server table.")
            End With

            'close and dispose the SQL server database connection
            connSqlSvr.Close()
            connSqlSvr.Dispose()
        End Using

运行代码我得到一个例外:

     "Column, parameter, or variable @MyTable. : Cannot find data type TableCheck."

我已经找到了将DataTable插入数据库的方法,并注意到许多样本都在使用INSERT INTO。我只是不认为我正在使用SqlParameter。

1 个答案:

答案 0 :(得分:0)

您的示例似乎使用TableCheck类型的表值参数,但您尚未在SQL Server中定义该类型。见http://msdn.microsoft.com/en-us/library/bb510489.aspx

CREATE TYPE LocationTableType AS TABLE 
( LocationName VARCHAR(50)
, CostRate INT );

虽然我无法保证您可以直接将TVP传递给原始SQL语句。

我实际上建议您使用SqlBulkCopy http://msdn.microsoft.com/en-us/library/ex21zs8x(v=vs.110).aspx使用不同的方法。