从一个SQL Server数据库表更新到另一个数据库表?

23

我尝试从一个SQL Server表更新数据库字段到另一个表。

我们的生产SQL Server是[spdbprod.test.com\spprod],我们的QA服务器是[spdbQA.test.com\spQA]

我需要从QA表更新生产表。我使用了这个SQL语句,但是出现了错误。

UPDATE 
    [spdbprod.test.com\spprod].[aspnetdb].[dbo].[Communities_Groups] as t1
SET 
    t1.Show = (Select t2.show from [spdbQA.test.com\spQA].[aspnetdb].[dbo].
[Communities_Groups] as t2 where t1.GroupID = t2.GroupdID)

我这里缺少什么? 错误信息: UPDATE. ("Incorrect syntax near the keyword 'as'.")


1
如果您发布类似这样的内容,并用“它会出错”来挑逗我们,最好的做法是告诉我们确切的错误是什么!这将极大地帮助我们了解可能存在的问题... - marc_s
@marc_s:我认为一个明显的错误是在UPDATE中使用了表别名。(“关键字'as'附近的语法不正确。”) - a1ex07
1
@a1ex07:那只是一个猜测——不错的猜测(我为你的好猜测点赞),但仍然只是猜测……而且这是关于一般原则的——不要只说“有错误”——如果你这样说——告诉我们那个错误是什么! - marc_s
1
@marc_s:当然,我完全同意您的观点。 - a1ex07
4个回答

33

您在使用表别名时有误。不能这样写 UPDATE table1 t SET field1=val,而应该写成 UPDATE table1 SET field=val(或者写成UPDATE table1 SET field=val FROM table1 t)。请将您的查询修改为:

UPDATE [spdbprod.test.com\spprod].[aspnetdb].[dbo].[Communities_Groups]   
SET Show = t2.show
FROM [spdbprod.test.com\spprod].[aspnetdb].[dbo].[Communities_Groups] t1
INNER JOIN [spdbQA.test.com\spQA].[aspnetdb].[dbo].
[Communities_Groups] t2 ON (t1.GroupID = t2.GroupID)

2
表单:"UPDATE t SET field=val FROM table1 t" 也可以使用。 - Moe Sisko
1
显然,[dbo] 部分比我想象的更重要。不过,你刚刚救了我的命!非常感谢。 - Drew Chapin

7

我知道这个问题已经有答案了,但是这个方法对我有效。

  • 在“服务器对象 | 链接服务器”下添加一个链接服务器: Microsoft文档

  • 将链接服务器命名为[服务器名称或<某个IP地址>,<某个端口号>]

    例如:[10.0.0.200,2345] - 我使用的是端口2345,但标准的MS SQL端口是1433

示例:

  • 我们有一个[Customers]
  • 我们想要更新[CustomerAddress]字段,条件是CustomerId = 123
  • 我们想要使用来自名为[backupServer]的服务器的备份数据
  • [backupServer]是我们执行SQL的机器

以下是SQL代码:

UPDATE production
SET
    CustomerAddress = backupServer.CustomerAddress
FROM 
    [10.0.0.200,2345].[ProductionDatabase].[dbo].[Customers] production
INNER JOIN 
    [BackupDatabase].[dbo].[Customers] backupServer
        ON 
            production.CustomerId = backupServer.CustomerId
WHERE 
    backupServer.CustomerId = 123

通用格式:

UPDATE production
SET
    columnName = backupServer.columnName
FROM 
    [SERVER-NAME or IP,PORT].[ProductionDatabase].[dbo].[tableName] production
INNER JOIN 
    [BackupDatabase].[dbo].[tableName] backupServer
        ON 
            production.SomeId = backupServer.SomeId
WHERE 
    backupServer.SomeId = <id>

对于那些想要从一个服务器复制表中的所有数据(INSERT)到另一个服务器的人来说,可以使用类似以下命令完成此操作:
SELECT * INTO TargetTable 
FROM 
[SERVER-NAME or IP, PORT].[SourceDatabase].[dbo].[SourceTable]

这将使用来自SourceTableSourceDatabase的数据,在SERVER-NAME或IP,PORT上创建一个名为TargetTable的新表。

2

我相信您需要拥有一个数据库链接(连接的服务器)才能使此功能正常工作。

我在工作中没有访问两个SQL服务器的权限,因此无法测试它,但我确信您需要该链接。

您是否设置了链接服务器?

这里有一个可能有帮助的URL:http://msdn.microsoft.com/en-us/library/ms188279.aspx


1
  1. 您需要在“服务器对象”下添加一个链接服务器
  2. 您可以将该链接服务器命名为“CHOOSEN-NAME”,也可以使用[ipaddress,端口号]

如何使用tsql添加链接服务器,请查看此链接:如何查找链接服务器

举个例子,假设我已经将链接服务器命名为“DESTINATION_SERVER”,数据库名称为“DESTINATION_DB”,表名称为“DESTINATION_TBL”。那么从您的源服务器查询可能是以下内容:

UPDATE t1  
SET t1.updatecolumn = t2.updatecolumn
FROM [DESTINATION_SERVER].[DESTINATION_DB].[dbo].[DESTINATION_TBL] t1
INNER JOIN [SOURCE-SERVER].[SOURCE_DB].[dbo].
[SOURCE_TBL] t2 ON (t1.matcingcolumn = t2.matchingcolumn)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接