繁体   English   中英

从另一个数据库更新SQL Server数据库

[英]Update SQL Server Database from another db

我有一个使用SQL Server 2008 R2的测试和生产环境。 我想从我的测试环境更新一些列到我的prod环境。 我的查询对我有意义,但它一直存在错误。 任何有关如何处理此事的建议都非常感谢。

use [NGProd]

update nxmd_practice_web_text
set nxmd_practice_web_text.item_value = TST.item_value
from [TestSQL1].[NGTest].[dbo].[nxmd_practice_web_text] TST
where TST.nx_modified_by = '00000000-0000-0000-0000-000000002692'
  and nxmd_practice_web_text.item_id = 4100
  and nxmd_practice_web_text.nx_practice_id = TST.nx_practice_id

我收到以下错误:

Msg 8180,Level 16,State 1,Line 1
声明无法准备。

Msg 306,Level 16,State 2,Line 1
除非使用IS NULL或LIKE运算符,否则无法比较或排序text,ntext和image数据类型。

item_value列是ntext但我没有比较它。 我正在设置它,所以这个错误让我很困惑。

我知道ntext数据类型已被弃用,但我无能为力。 这是一种付费产品,在数千个表中包含数百万行数据。 如果没有在将来的更新(每半年发布一次)中将其转换回来,我无法修改此行类型。

任何帮助是极大的赞赏。

谢谢。

在尝试使用Sql 2008和Sql 2000服务器重新创建错误之后,当我将nx_modified_by更改为ntext或者将practice_id更改为ntext时,我只能得到类似的错误。 Sql Server 2008错误消息是:

消息402,级别16,状态1,行8数据类型ntext和varchar在等于运算符中不兼容。

我猜nx_modified_by也是ntext(而不是unique_identifier),但是如果它是nx_practice_id,则包括注释掉的行。

尝试这个:

use [NGProd]
go
update prod 
  set prod.item_value = tst.item_value 
  from NGProd.[dbo].[nxmd_practice_web_text] as prod
    inner join [TestSQL1].[NGTest].[dbo].[nxmd_practice_web_text] as tst
      on prod.nx_practice_id = tst.nx_practice_id
      /*
        on cast(prod.nx_practice_id as varchar(8000)) 
         = cast(prod.nx_practice_id as varchar(8000)) 
         --*/
  where prod.item_id = 4100
    and cast(tst.nx_modified_by as varchar(36)) 
      = '00000000-0000-0000-0000-000000002692'
    --and tst.nx_modified_by = '00000000-0000-0000-0000-000000002692'

此外,请确保在“链接服务器属性”上启用了“处理中”

Technet - 链接服务器属性 - 允许进程

允许进程

SQL Server允许将提供程序实例化为进程内服务器。 如果未设置此选项,则默认行为是在SQL Server进程外实例化提供程序。 在SQL Server进程外部实例化提供程序可以保护SQL Server进程免受提供程序中的错误的影响。 在SQL Server进程外部实例化提供程序时,不允许引用长列(text,ntext或image)的更新或插入。

那里有几个问题。 发出更新并从联接查询中获取值时,您需要更新别名。 否则你可以得到一些时髦的结果。 您可以将更新更改为更像这样的内容。

update wt
set item_value = cast(TST.item_value as varchar(max))
from [TestSQL1].[NGTest].[dbo].[nxmd_practice_web_text] TST
join nxmd_practice_web_text wt on wt.nx_practice_id = TST.nx_practice_id
where TST.nx_modified_by = '00000000-0000-0000-0000-000000002692'
  and wt.item_id = 4100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM