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

时间:2014-12-16 21:35:21

标签: sql sql-server sql-server-2008-r2 linked-server

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

非常感谢任何帮助。

谢谢。

2 个答案:

答案 0 :(得分:3)

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

  

Msg 402,Level 16,State 1,Line 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 - Linked Server Properties - Allow inprocess

  

允许进程

     
    

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

  

答案 1 :(得分:0)

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

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