在SQL Server 2008中从varbinary(MAX)字段(不使用FileStreams)读取部分二进制数据的最有效方法是什么?
将数据写入列时,VarBinary.Write()函数在T-SQL中可用,允许以递增方式将字节写入字段,但似乎没有类似的函数可用于读取数据.
我知道.Net中的DataReader.GetBytes()方法会选择你要求的字节,但这会带来性能开销吗?也就是说,sqlserver中的select会读取数据库中的所有字节,然后给getBytes()方法提供所有这些字节,以便获取从它们请求的字节子集吗?
谢谢你的帮助.
我正在尝试使用ASP.Net提供存储在数据库中VARBINARY(MAX)字段中的图像数据.现在,代码填充数据表,然后将字节数组拉出DataRow并将字节数组推送到响应中.我想知道是否有办法将数据从SQL Server或多或少地流入响应,而不必围绕这些巨大的字节数组进行编组(因为图像很大,它们会导致OutOfMemoryExceptions).是否有类/机制?
当前代码看起来或多或少像:
DataTable table = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(commandText, connectionString);
adapter.Fill(table);
DataRow row = table.Rows[0];
byte[] imageData = row[0] as byte[];
if(imageData != null)
{
Response.Clear();
Response.BinaryWrite(imageData);
Response.End();
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢 - 任何帮助表示赞赏.
我有一个VARBINARY(MAX)字段的表(SQL Server 2008 FILESTREAM)
我的要求是,当我去部署到生产时,我只能为我的IT团队提供一组SQL脚本,以便按特定顺序执行.我正在制作的新表有这个VARBINARY(MAX)领域.通常使用新表,我会编写CREATE TABLE脚本脚本.而且,如果我有数据,我需要使用它,然后我将编写INSERT脚本脚本.不太复杂.
但是VARBINARY(MAX),我用来生成INSERT语句的存储过程在该表上失败了.我尝试选择该字段,打印,复制,转换为十六进制等.我遇到的主要问题是它没有选择字段中的所有数据.我做了一个检查DATALENGTH([FileColumn]),如果源行包含1,004,382字节,那么当我再次插入时,我可以获得复制或选择的数据的最大值是8000.所以基本上它是截断的(即无效的)数据.....
我怎么能做得更好?我试着像疯了一样搜索谷歌但我必须遗漏一些东西.请记住,我无法访问文件系统.这必须全部编写脚本.
有没有办法使用SQL Management Studio将文件上传到varbinary而无需编写手动SQL查询?
我有一个很长的存储过程,当我执行该过程时,我收到以下错误:
Msg 206, Level 16, State 2, Line 1
Operand type clash: varchar(max) is incompatible with sql_variant
Run Code Online (Sandbox Code Playgroud)
因此,为了解决问题,我已经打印了问题所在的问题,代码是:
SELECT 'Name' ,
7 ,
CASE WHEN 'varchar' = 'varbinary'
THEN REPLACE(UPPER(sys.fn_sqlvarbasetostr([Name])), 'X', 'x')
ELSE CONVERT(VARCHAR(4000), [Name])
END , 'varchar'
FROM ref.dbo.datatables
WHERE id = 12
ORDER BY [ID]
Run Code Online (Sandbox Code Playgroud)
所以当我执行上面的语句时,它会将错误视为:
Msg 206, Level 16, State 2, Line 1
Operand type clash: varchar(max) is incompatible with sql_variant
Run Code Online (Sandbox Code Playgroud)
Name的数据类型是ref.dbo.datatables表中的Varchar(MAX)
如何解决这个问题?
回答:
这就是我的工作:
SELECT 'Name',
7,
CASE WHEN 'varchar' = 'varbinary'
THEN REPLACE(UPPER(sys.fn_sqlvarbasetostr(CONVERT(VARBINARY,[Name]))),'X','x')
ELSE CONVERT(VARCHAR(4000),[Name]) …Run Code Online (Sandbox Code Playgroud) 我正在尝试将用户CONTEXT_INFO代码从存储过程传递到DELETE触发器以进行表审计.
一切正常,但是我注意到审计表中保存的用户代码的长度不正确.
以此脚本为例......
declare @userCode varchar(50)
set @userCode = 'TestUser'
declare @binary_userCode varbinary(128)
set @binary_userCode = cast(@userCode as varbinary(128))
set CONTEXT_INFO @binary_userCode
declare @temp_userCode varchar(50)
set @temp_userCode = (select cast(CONTEXT_INFO() as varchar(50)))
--set @temp_userCode = rtrim(ltrim(@temp_userCode))
select @userCode, len(@userCode), @temp_userCode, len(@temp_userCode)
set CONTEXT_INFO 0x
Run Code Online (Sandbox Code Playgroud)
结果:
len(@userCode)= 8
len(@temp_userCode)= 50
为什么@temp_userCode变量的长度为50,如何将其修剪回原始长度以正确存储?
更多的信息:
运行SQL Server 2005,但该解决方案需要在2005年以后的所有版本中运行.
我需要生成一个SQL插入脚本来将数据从一个SQL Server复制到另一个SQL Server.因此,使用.net,我正在读取给定SQL Server表的数据并将其写入新的文本文件,然后可以执行该文件以便将此数据插入到其他数据库中.
其中一列是VARBINARY(MAX).
我应该如何将获得的byte []转换为脚本的文本,以便它仍然可以插入到其他数据库中?
SSMS将此数据显示为十六进制字符串.这是使用的格式吗?我可以使用以下相同的格式
BitConverter.ToString(<MyByteArray>).Replace("-", "")
Run Code Online (Sandbox Code Playgroud)
但是如何重新插入呢?
我试过了
CONVERT(VARBINARY(MAX), "0xMyHexString")
Run Code Online (Sandbox Code Playgroud)
这会进行插入,但该值与源表中的值不同.
我正在寻找一种只使用T-SQL从表中检索实体数据模型(EDM)的方法(所以任何人,只使用Microsoft SQL Server Management Studio,都可以这样做).__MigrationHistory
我想要一个有效的BASE64字符串值.
我不想完全解压缩到EDMX.
我不想从*.resx迁移文件中获取它.
当我__MigrationHistory在SSMS中选择整体时,Model列值如下
0x1F8B0800000000000400CD57DB6EDB38107D5F60FF81E0D31648C5247DD906528BD4898BA075525469DF6969EC10CB8BCA4B607F5B1FFA49FB0B3BBACB521CB7E9A228020422357366E6F0CC50FEF7EBB7F8F54649720FD609A3137A121D53023A33B9D0EB8406BF7AFE377DFDEACF3FE2CB5C6DC8E7D6EE4569879EDA25F4CEFBE28C3197DD81E22E5222B3C699958F32A318CF0D3B3D3E7EC94E4E182004452C42E28F417BA1A05AE072667406850F5C2E4C0ED235FBF826AD50C93557E00A9E414253AE0A0917DCF325771035CB254278D8784ACEA5E098550A724509D7DA78EE31E7B34F0E526F8D5EA7056E7079BB2D00ED565C3A686A39EBCDBFB7ACE3D3B22CD63BB6505970DEA81F043C79D1F0C4C6EE4F629B763C229397C8B8DF9655576C26746E0C25E3386733694B9B433C47159C001721CC11D9353EEA84827A2AFF8EC82C481F2C241A82B75C1E910F612945F60EB6B7E61FD0890E520ED3C584F1DDCE066E7DB0A600EBB71F61D514719553C276FDD8D8B1731BF8D435BE0D029FAF31365F4AE8C4C01E752FFFB700A8286C144A167CF31EF4DADF25141F29998B0DE4ED4E83FA490BEC2B74F2368C82C4AC3F9DE999959473A1C136094C243F3944D47A738EAE09B75B518D9B82EFA5E028E973A8DB27AA14F2509E5D467DA3B2BA53DB8E667B5A3A5EF0A240CA062DDEEC90B4EEEFD9F3F4C7C5AE6A0C96B90734DF65DB45F2C6F2358CDE6268CC742EACF3AD902999E56A6236E67F0FB76DB401C5633DF78CB7C6E5F3CE29EFEBBFF26C46703D97732C4F81F655A5D06554F7FCC4AB1AB35C72FB409FCC8C0C4AEFEBB5C7BCEB3619FAD73B5384988DD21ED3C4263C8D3A7ECCF963921D9B74D13BE98E241A3772397C354DF4539B5082D4DC8BBCD2CED67950516910A55FE44C0AACB73758702D56E07C3D1429DE08A7A31BEDF7B95D9873B93C7CC5FCF2A11EB4F81200D9C46C5602EC4F0D787DCF6D76C7ED5F8A6F9E0D917E76884F67CDC111BD6F42D72A4B68BEC4C56D9D5E3DD19F38BBA7828FD9F08B2DBE0027D63D44F9FDA6212B95D483B636577A655A82B19C6146ADC988FF05789E232BE7160F90671E5F67E05C75D17EE632A0C9A55A427EA56F822F823F770ED4526E87F5C6ECF1F8D505B59B737C53942BF77F9480690A2C016EF49B2064DEE53D9FEA6F1F442990B780FB5587E28706C2ADB71DD2B5D1DF09D4D0770105E8B2296E016F120473373AE5F7F094DCF0FBE23DAC79B66DE7D67E90C307B14B7B7C21F8DA72E51A8CDEBFFC15C2CA9F21AFFE038574340FB80C0000
Run Code Online (Sandbox Code Playgroud)
这是我的示例数据库,所以我不介意分享它.
该列是类型varbinary(max),我google了如何将其转换为UTF8*-ish*文本.
SQL Server:将字符串转换为十六进制字符串并返回#sql #sqlserver
对于
SELECT CONVERT(VARCHAR(max), 0x1F8B0800000000000400CD57DB6EDB3810..... , 0)
Run Code Online (Sandbox Code Playgroud)
甚至更直接
SELECT CONVERT(VARCHAR(max), (SELECT TOP (1) [t0].[Model]FROM [__MigrationHistory] AS [t0]), 0);
Run Code Online (Sandbox Code Playgroud)
我得到以下结果

从字面上看: ‹
我检查了我Model是否在LinqPad5中没有损坏或不完整并使用此处找到的工具,但它看起来没问题.


只是一个简单的问题..
在下面提到的两个选项中,如何varbinary在MySQL中存储到列?
public_key = '67498930589635764678356756719'
Run Code Online (Sandbox Code Playgroud)
要么
public_key = 67498930589635764678356756719
Run Code Online (Sandbox Code Playgroud)
第二种方法会起作用吗?我正处于生产服务器上的紧急时刻,并且不想尝试它.
感谢您的任何帮助.
在SQL Server 2008 R2中,我可以使用varbinary(max)插入文件的最大大小是多少?我试图将列中的最大值更改为超过8,000字节,但它不会让我,所以我猜测最大值是8,000字节,但是从MSDN上的这篇文章中,它说最大存储大小为2 ^ 31-1字节:
varbinary [(n | max)]
可变长度的二进制数据.n可以是1到8,000之间的值.max表示最大存储大小为2 ^ 31-1个字节.存储大小是输入数据的实际长度+ 2个字节.输入的数据长度可以是0个字节.varbinary的ANSI SQL同义词是二进制变量.
那么如何在varbinary字段中存储更大的文件呢?我不打算使用FILESTREAM,因为我要保存的文件最大为200kb到1mb,我正在使用的代码:
UPDATE [table]
SET file = ( SELECT * FROM OPENROWSET ( BULK 'C:\A directory\A file.ext', SINGLE BLOB) alias)
WHERE idRow = 1
Run Code Online (Sandbox Code Playgroud)
我已经能够成功地将该代码执行到小于或等于8000字节的文件.如果我尝试使用8001字节大小的文件,它将失败.我在表上的文件字段有一个名为"文件"类型的字段varbinary(8000),正如我所说,我无法更改为更大的值.
sql-server varbinary sql-server-2008 sql-server-2008-r2 varbinarymax