我对 T-SQL 和 SQL 2005 还很陌生。我需要将数据库 1 中的表中的一列整数导入到数据库 2 中的相同表(仅缺少我需要的列)。两者都是sql 2005数据库。我已经尝试过 Server Management Studio 中的内置导入命令,但它迫使我复制整个表。由于约束和“只读”列(无论 sql2005 中的“只读”意味着什么),这会导致错误。我只想抓取一列并将其复制到表中。

必须有一个简单的方法来做到这一点。就像是:

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
有帮助吗?

解决方案

插入不会执行此操作,因为它会尝试在表末尾插入新行。听起来您想要做的是将一列添加到现有行的末尾。

我不确定语法是否完全正确,但是,如果我理解你,那么这将完成你所追求的事情。

  1. 在database2 中创建允许空值的列。

  2. 执行更新:

    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

其他提示

有一种非常类似的简单方法,只要两个数据库位于同一服务器上即可。完全合格的名称为dbname.owner.table-通常所有者是DBO,并且有“ .dbo”的快捷方式。这是“ ..”,所以...

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable

如果该列不存在,则首先创建该列:

ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed

由于您使用的是 Sql Server 2005,因此您可以使用新的 合并 陈述。合并 语句的优点是能够在一个语句中处理所有情况 比如源中丢失的行(可以执行插入)、目标中丢失的行(可以执行删除)、匹配的行(可以执行更新),并且所有操作都在单个事务中自动完成。例子:

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 在一条语句中完成的相同操作,而不会增加复杂性。

您也可以使用光标。假设您想要迭代第一个表中的所有记录并用新行填充第二个表,那么可以这样做:

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

MERGE 仅在 SQL 2008 中可用,不适用于 SQL 2005

插入 Test2.dbo.MyTable (MyValue) 从 Test1.dbo.MyTable 选择 MyValue

这是一个很大的假设。首先目标数据库是空的。其次,其他列可以为空。您可能需要更新。为此,您需要有一个公用密钥。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top