SQL 2005在数据库之间复制单列
我对T-SQL和SQL 2005还是相当陌生。我需要将一列整数列从database1中的表导入到database2中相同的表中(仅缺少我需要的列)。两者都是sql 2005数据库。我已经尝试了Server Management Studio中的内置导入命令,但是这迫使我复制整个表。由于约束和"只读"列而导致错误(无论sql2005中的"只读"是什么意思)。我只想获取一列并将其复制到表中。
必须有一个简单的方法来执行此操作。就像是:
INSERT INTO database1.myTable columnINeed SELECT columnINeed from database2.myTable
解决方案
回答
插入到Test2.dbo.MyTable(MyValue)中,从Test1.dbo.MyTable中选择MyValue
这是一个很大的假设。首先,目标数据库为空。其次,其他列可为空。我们可能需要更新。为此,我们将需要一个公用密钥。
回答
只要两个数据库都在同一台服务器上,就有一种非常简单的方法。完全限定的名称是dbname.owner.table,通常所有者是dbo,并且有一个" .dbo"的快捷方式。这是" ..",所以...
INSERT INTO Datbase1..MyTable (ColumnList) SELECT FieldsIWant FROM Database2..MyTable
回答
插入不会这样做,因为它将尝试在表的末尾插入新行。听起来我们想做的就是在现有行的末尾添加一列。
我不确定语法是否正确,但是,如果我理解意思,那么我们会做什么。
- 创建在database2中允许为空的列。
- 执行更新:UPDATE database2.dbo.tablename SET database2.dbo.tablename.colname = database1.dbo.tablename.colname FROM database2.dbo.tablename INNER JOIN database1.dbo.tablename ON database2.dbo.tablename.keycol = database1. dbo.tablename.keycol
回答
我们也可以使用光标。假设我们要遍历第一个表中的所有记录,并用新行填充第二个表,则可以使用以下方法:
DECLARE @FirstField nvarchar(100) DECLARE ACursor CURSOR FOR SELECT FirstField FROM FirstTable OPEN ACursor FETCH NEXT FROM ACursor INTO @FirstField WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO SecondTable ( SecondField ) VALUES ( @FirstField ) FETCH NEXT FROM ACursor INTO @FirstField END CLOSE ACursor DEALLOCATE ACursor
回答
如果不存在,请首先创建该列:
ALTER TABLE database2..targetTable ADD targetColumn int null -- or whatever column definition is needed
由于我们使用的是Sql Server 2005,因此可以使用新的MERGE语句。
MERGE语句的优点是能够在一条语句中处理所有情况,例如源中缺少行(可以执行插入操作),目标中缺少行(可以执行删除操作),匹配行(可以执行更新操作)以及所有操作都是原子完成的在一次交易中。例子:
MERGE database2..targetTable AS t USING (SELECT sourceColumn FROM sourceDatabase1..sourceTable) as s ON t.PrimaryKeyCol = s.PrimaryKeyCol -- or whatever the match should be bassed on WHEN MATCHED THEN UPDATE SET t.targetColumn = s.sourceColumn WHEN NOT MATCHED THEN INSERT (targetColumn, [other columns ...]) VALUES (s.sourceColumn, [other values ..])
引入MERGE语句是为了解决像我们这样的情况,我建议使用它,它比使用多个sql批处理语句的解决方案要强大得多,这些解决方案基本上可以在一个语句中完成MERGE所做的相同工作,而不会增加复杂性。
回答
MERGE仅在SQL 2008中可用,而在SQL 2005中不可用