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