【问题标题】:How to insert a blob into a database using sql server management studio如何使用 sql server management studio 将 blob 插入数据库
【发布时间】:2009-10-29 13:12:38
【问题描述】:

如何轻松地将 blob 插入 varbinary(MAX) 字段?

举个例子:

我要插入的是:c:\picture.png
表是 mytable
专栏是 mypictureblob
这个地方是recid=1

【问题讨论】:

    标签: sql sql-server sql-server-2005 blob


    【解决方案1】:

    您可以在 SQL Server Management Studio 中使用 T-SQL 插入 varbinary(max) 字段,尤其是使用 OPENROWSET 命令。

    例如:

    INSERT Production.ProductPhoto 
    (
        ThumbnailPhoto, 
        ThumbnailPhotoFilePath, 
        LargePhoto, 
        LargePhotoFilePath
    )
    SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
    FROM OPENROWSET 
        (BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto
    

    查看以下文档以获取很好的示例/演练

    Working With Large Value Types

    请注意,这种情况下的文件路径是相对于目标 SQL 服务器的,而不是您运行此命令的客户端。

    【讨论】:

    • TSQL 与顶部工具栏右侧的“新查询”按钮一样吗?
    • T-SQL 是 SQL Server 使用的查询语言。是的,您需要创建一个新查询......
    • john...我正在尝试理解语法,但我失败得很惨。鉴于我在上面发布的示例,还有其他 3 个列:column1、column2 和 column3。 SQL 的外观如何?
    • 它还给出了我不允许使用 bulk_load 的错误... aaaargh。这么简单的事情怎么会这么难!
    • 虽然这并没有为我解决它......它显然为其他人解决了它并且它最直接地回答了我的问题。所以我会接受这个答案。我仍然强烈认为管理工作室应该为 blob 提供一些 gui 的东西,其中一个可以直接上传文件或图像(并查看/检查它)。
    【解决方案2】:

    MSDN有一篇文章Working With Large Value Types, 它试图解释导入部分是如何工作的,但它可能会有点混乱,因为它同时做两件事。

    这里我提供了一个简化版本,分为 2 个部分。假设如下简单表格:

    CREATE TABLE [Thumbnail](
       [Id]        [int] IDENTITY(1,1) NOT NULL,
       [Data]      [varbinary](max) NULL
    CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED 
    (
    [Id] ASC
    ) ) ON [PRIMARY]
    

    如果您运行(在 SSMS 中):

    SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
    

    它会显示,结果看起来像一个表,其中有一列名为BulkColumn。这就是为什么您可以在 INSERT 中使用它,例如:

    INSERT [Thumbnail] ( Data )
    SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
    

    其余的只是将其放入具有更多列的插入中,您的表可能有也可能没有。如果您将结果命名为 select FOO,那么您可以在表中其他字段的常量之后使用 SELECT Foo.BulkColumnas

    更棘手的部分是如何将数据导出回文件中,以便您检查它是否仍然正常。如果你在命令行上运行它:

    bcp "select Data from B2B.dbo.Thumbnail where Id=1" 
    queryout D:\T\TestImage1_out2.dds -T -L 1 
    

    它将开始抱怨 4 个额外的“参数”,并且会给出误导性的默认值(这将导致文件更改)。您可以接受第一个,将第二个设置为 0,然后设置第三个和第四个,或者明确:

    输入字段Data的文件存储类型[varbinary(max)]:
    输入字段数据[8]的前缀长度:0
    输入字段数据 [0] 的长度:
    输入字段终止符 [无]:

    然后它会问:

    您想将此格式信息保存在文件中吗? [是/否] 是
    主机文件名 [bcp.fmt]:C:\Test\bcp_2.fmt

    下次你必须运行它时添加-f C:\Test\bcp_2.fmt,它会停止抱怨:-) 节省大量时间和痛苦。

    【讨论】:

    • 为一个非常过时(但始终相关)的问题付出了巨大的努力。
    • 需要在FROM子句中指定别名
    • 我们在九年后(直到今天!),这个答案仍然非常精彩。尽管与 SQL Server 合作了 20 年,但我以前从未处理过这个问题,你的回答很好地说明了一切。
    【解决方案3】:

    使用 TSQL 选择 BLOB 有两种方法:

    SELECT * FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
    

    还有:

    SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
    

    注意 FROM 子句后的相关名称,这是强制性的。

    然后您可以通过执行 INSERT SELECT 将其插入。

    您还可以使用第二个版本进行更新,正如我在 How To Update A BLOB In SQL SERVER Using TSQL 中描述的那样。

    【讨论】:

      【解决方案4】:

      但是,您可以简单地从 SQL 服务器机器上的磁盘读取文件:

      select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a
      

      以十六进制形式在管理应用程序中查看它(Management Studio)。

      因此,例如,您可以将数据库备份到文件(本地在服务器上),然后通过上述语句将其下载到其他地方。

      【讨论】:

        【解决方案5】:

        您需要在 mgmt studio 中进行操作吗?以下是我们从 cmd 行执行此操作的方法:

        "C:\Program Files\Microsoft SQL Server\MSSQL\Binn\TEXTCOPY.exe" /S /D /T mytable /C mypictureblob /F "C:\picture.png" /W "在哪里 RecId=" /I

        【讨论】:

        • 抱歉,我的一些 cmets 好像有条纹。 /S 选项是服务器,/D 是数据库
        • sql 2005 不再提供它 =^(
        【解决方案6】:

        好吧...这花了我太长时间了。 sql-management studio 工具不能胜任这样简单的事情(我之前在寻找设置查询超时的位置时注意到了这一点,并且它在 4 个不同的位置完成)

        我下载了一些其他的 sql 编辑器包(在我的例子中是 sql maestro)。瞧,它包含一个 blob 编辑器,您可以在其中查看 blob,并将新 blob 加载到这些字段中。

        感谢您的意见!

        【讨论】:

          猜你喜欢
          • 2011-01-25
          • 2010-12-12
          • 2010-11-10
          • 2011-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-24
          相关资源
          最近更新 更多