【问题标题】:Copying BLOB values between databases with pure SQL in SQL Server在 SQL Server 中使用纯 SQL 在数据库之间复制 BLOB 值
【发布时间】:2010-09-21 06:45:01
【问题描述】:

我需要从 SQL Server 2005 数据库中提取一些 BLOB 数据并生成一个 SQL 脚本,以将这些相同的数据插入到另一个数据库中的另一个服务器中。

我只能使用 SQL 脚本来执行此操作,我不能使用任何其他实用程序或用 Java 或 .NET 编写程序来执行此操作。

我的另一个大限制是,当我运行脚本时,我无权访问原始数据库(原始 BLOB 数据所在的位置),将 BLOB 数据复制到目标数据库,所以数据应该已经在 SQL 脚本文件中进行编码。

总结:有没有办法将 BLOB 数据编码为文本,以便我可以将其转储到脚本文本文件中的 SQL INSERT 命令中并运行它?

如果需要,我可以运行特殊的 T-SQL 语句和存储过程。

【问题讨论】:

    标签: sql sql-server tsql stored-procedures blob


    【解决方案1】:

    TEXTCOPY 是 SQL Server 7.0 和 2000 中包含的示例应用程序,但在 SQL Server 2005 中不再可用。

    但是,在 SQL Server 2005 中搜索 TEXTCOPY 时,我发现这个替代方案可能会奏效:

    http://sequelserver.blogspot.com/2007/01/texcopy-sql-server-2005.html

    它依赖于从文件系统写入和读取二进制数据,在我的情况下这并不理想(理想情况下,我想用 SQL 脚本文本文件本身对二进制数据进行编码),但这是我发现的最好的到目前为止。

    这是另一个关于如何使用 BULK OPENROWSET 进行二进制导入/导出操作的好资料: http://msdn.microsoft.com/en-us/library/ms191184.aspx

    【讨论】:

      【解决方案2】:

      这篇文章“Copy Text or Image into or out of SQL Server”可能会有所帮助:

      您可以将 TEXTCOPY 命令行工具集成到存储过程中:

      CREATE PROCEDURE sp_textcopy (
        @srvname     varchar (30),
        @login       varchar (30),
        @password    varchar (30),
        @dbname      varchar (30),
        @tbname      varchar (30),
        @colname     varchar (30),
        @filename    varchar (30),
        @whereclause varchar (40),
        @direction   char(1))
      
      AS
      
      DECLARE @exec_str varchar (255)
      SELECT @exec_str =
               'textcopy /S ' + @srvname +
               ' /U ' + @login +
               ' /P ' + @password +
               ' /D ' + @dbname +
               ' /T ' + @tbname +
               ' /C ' + @colname +
               ' /W "' + @whereclause +
               '" /F ' + @filename +
               ' /' + @direction
      EXEC master..xp_cmdshell @exec_str
      

      您必须稍微更改/扩展它才能将创建的文件读入其他数据库。

      正如Vinko 在对此答案的评论中所写,请记住,这需要在表面区域配置中启用 xp_cmdshell。

      TEXTCOPY 说明:

      将单个文本或图像值复制到 SQL Server 中或从 SQL Server 中复制出来。价值 是单行的指定文本或图像“列”(由 "where 子句") 的指定 'table'。

      如果方向为 IN (/I),则来自指定“文件”的数据为 复制到 SQL Server,替换现有的文本或图像值。如果 方向为 OUT (/O),然后复制文本或图像值 SQL Server 进入指定的“文件”,替换任何现有文件。

      【讨论】:

      • 这需要在表面积配置中启用 xp_cmdshell
      • 感谢您的回答,但我不确定我是否可以访问 textcopy 实用程序。一个纯粹的基于 SQL 的解决方案正是我想要的。
      【解决方案3】:

      看看这个问题并在页面上搜索 bcp - 有 varbinary(max) 的导入和导出示例(这是此类列的新标准类型)。您可以运行任意查询以进行导出。

      How to insert a blob into a database using sql server management studio

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多