【问题标题】:How To Update A BLOB In SQL SERVER Using TSQL如何使用 TSQL 在 SQL SERVER 中更新 BLOB
【发布时间】:2012-08-02 23:49:20
【问题描述】:

如何仅使用 TSQL(例如从 SSMS 而不使用 ADO.Net 或 Linq 等任何代码)更新 BLOB 字段?

【问题讨论】:

    标签: sql sql-server tsql sql-update blob


    【解决方案1】:

    使用 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 子句后的相关名称,这是强制性的。

    第二个版本可用于更新,如下例所示:

    UPDATE MyTable 
    SET blobField = 
       (SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a) 
    WHERE (CriteriaField = @criteria)
    

    对于部分更新,可以使用this MSDN article 中描述的 SET .WRITE mutator,语法如下:

    UPDATE MyTable SET BlobField .WRITE (expression, @offset, @length) WHERE (CriteriaField = @criteria)
    

    请注意,WRITE mutator 只能用于 NON-NULL 字段。

    事实上,这也可以用于进行完全更新(如果列不包含 NULL),方法是将 @offset 设置为 0 并将 @length 设置为 NULL(或实际长度),如下例所示:

    DECLARE @tmp VARBINARY(MAX) --Change to the correct datatype here
    SELECT @tmp = BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
    UPDATE MyTable SET BlobField .WRITE (@tmp, 0, NULL) WHERE (CriteriaField = @criteria)
    

    【讨论】:

    • 事实上,SELECT 的第一个版本实际上只不过是第二个 SELECT,只是使用了 SELECT *,但我仍然将它作为单独的版本包含在内,因为这是 MSDN 和其他在线资源中使用的示例,并且似乎许多开发人员认为这是唯一的方法
    • 这些选择给了我诸如“无法批量加载”之类的错误。文件 X 不存在”和“无法批量加载,因为无法打开文件 X。操作系统错误代码 3(系统找不到指定的路径。)。但是文件显然在正确的位置,并且路径是正确的。我错过了一些设置吗?在 SQL Server 2012 上。SQL Server 用户对 C 盘和 C 盘中的文件具有完全控制权。
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2018-06-24
    相关资源
    最近更新 更多