我正在处理两个无法同时访问的数据库。我在这里看到的处理这个的标准方法之一是创建动态sql以从另一个加载一个。
我创建了一个存储过程,它将从现有数据库中删除更新语句。我的问题是当XML太大而无法保存在VARCHAR(max)中时会发生什么。
以下是我尝试的相关代码段,其中field2实际上是XML数据类型:
DECLARE @field1Col VARCHAR(50)
DECLARE @field2Col VARCHAR(max)
DECLARE @vsSQL VARCHAR(max)
DECLARE curUpdates CURSOR FOR
-- field 1 is varchar(50), not null
-- field 2 is XML(.), null
SELECT
t.field1
,REPLACE(CAST(t.[field2] AS VARCHAR(max)), '''', '''''')
FROM
myTable t
WHERE
t.criteria = 0
OPEN curUpdates
FETCH NEXT FROM curUpdates INTO @field1Col, @field2Col
WHILE @@FETCH_STATUS = 0
BEGIN
SET @vsSQL = 'UPDATE dbo.myTable SET [field1] = ''' + @field1Col+ ''' WHERE [field2] = ''' + @field2Col + ''''
INSERT INTO @tmp ( SQLText ) VALUES ( @vsSQL )
FETCH NEXT FROM curUpdates INTO @field1Col, @field2Col
END
CLOSE curUpdates
DEALLOCATE curUpdates
SET NOCOUNT OFF;
SELECT * FROM @tmp
我遇到的问题是即使使用VARCHAR(max),XML有时会超出大小。最终产品在达到如此多的字符(VARCHAR的最大大小?)时会停止。
是否有另一种处理大型XML的方法(拆分成块,避免转换等),我可以从中构建一串更新语句?
答案 0 :(得分:0)
我无法访问数据库B.我想(一次运行)更新 数据库B中的几个表
一次运行可能指向以下内容:
CREATE DATABASE MyOneTimeRun;
GO
USE MyOneTimeRun;
GO
SELECT * INTO MyCopy FROM YourDatabase.dbo.YourTable;
GO
BACKUP DATABASE [MyOneTimeRun] TO DISK = N'C:\Path\MyOneTimeRun.bak' WITH NOFORMAT, NOINIT
,NAME = N'MyOneTimeRun-Copy of MyTable'
,SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
USE master;
GO
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyOneTimeRun'
GO
USE [master]
GO
ALTER DATABASE [MyOneTimeRun] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
DROP DATABASE [MyOneTimeRun]
GO
现在您有一个BAK文件,其中包含您可以在其他服务器上恢复的内容。
在那里,您使用适当的脚本来将数据类型安全洗牌并从副本中清除到目标中。