2

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

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

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
4

6 回答 6

5

插入不会这样做,因为它会尝试在表的末尾插入新行。听起来您尝试做的是在现有行的末尾添加一列。

我不确定语法是否完全正确,但是,如果我理解您,那么这将满足您的要求。

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

  2. 执行更新:

    更新 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。关键点

于 2008-09-09T17:18:52.877 回答
2

只要两个数据库都在同一台服务器上,就有一种非常简单的方法。完全限定名称是 dbname.owner.table - 通常所有者是 dbo,并且有一个“.dbo”的快捷方式。这是“..”,所以...

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable
于 2008-09-09T17:15:06.770 回答
2

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

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 在一个语句中所做的事情,而不会增加复杂性。

于 2008-09-09T17:31:10.367 回答
1

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

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
于 2008-09-09T17:23:05.110 回答
1

MERGE 仅适用于 SQL 2008 而不是 SQL 2005

于 2008-12-05T11:14:00.300 回答
0

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

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

于 2008-09-09T17:13:33.107 回答