如何从大型XML数据类型创建UPDATE语句?

时间:2016-09-14 16:25:42

标签: sql-server

我正在处理两个无法同时访问的数据库。我在这里看到的处理这个的标准方法之一是创建动态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的方法(拆分成块,避免转换等),我可以从中构建一串更新语句?

1 个答案:

答案 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文件,其中包含您可以在其他服务器上恢复的内容。

在那里,您使用适当的脚本来将数据类型安全洗牌并从副本中清除到目标中。