代码之家  ›  专栏  ›  技术社区  ›  Paulj

SQL 2005在数据库之间复制单列

  •  2
  • Paulj  · 技术社区  · 16 年前

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

    必须有一个简单的方法来做到这一点。类似:

    INSERT INTO database1.myTable columnINeed
    SELECT columnINeed from database2.myTable
    
    6 回复  |  直到 10 年前
        1
  •  5
  •   Allain Lalonde    16 年前

    插入操作无法完成,因为它将尝试在表的末尾插入新行。您尝试执行的操作听起来像是在现有行的末尾添加一列。

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

    1. 创建允许在数据库2中为空的列。

    2. 执行更新:

      更新database2.dbo.tablename 设置database2.dbo.tablename.colname=database1.dbo.tablename.colname 从database2.dbo.tablename内部联接database1.dbo.tablename on database2.dbo.tablename.keycol=database1.dbo.tablename.keycol

        2
  •  2
  •   Peter    16 年前

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

    INSERT INTO Datbase1..MyTable
        (ColumnList)
    SELECT FieldsIWant
      FROM Database2..MyTable
    
        3
  •  2
  •   Pop Catalin    16 年前

    首先创建不存在的列:

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

    由于您使用的是SQL Server 2005,因此可以使用 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在一个语句中所做的相同工作,并且不增加复杂性。

        4
  •  1
  •   Carl    16 年前

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

    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
    
        5
  •  1
  •   Darryn    16 年前

    合并仅在SQL 2008中可用,而不是SQL 2005

        6
  •  0
  •   Craig    16 年前

    插入test2.dbo.mytable(myvalue)从test1.dbo.mytable中选择myvalue

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