从varchar中获取字节
[word]是varchar(600)
以下代码的问题是它总是检索30个字节
如果[word]长于30,则字节被截断
如果[word]短于30,则填充0
如何检索实际的字节数
是的我真的需要[word]的字节。
5个标签的限制:SQL 2008 R2,C#
SqlCommand sqlCmd = sqlCon.CreateCommand();
System.Data.SqlTypes.SqlBytes charSB;
byte[] charB;
Int32 id;
sqlCmd.CommandText = "select [ID], cast(Rtrim([word]) as binary), [word] " +
"from [FTSwordDef] with (nolock) order by [word];";
SqlDataReader rdr = sqlCmd.ExecuteReader();
while (rdr.Read())
{
id = rdr.GetInt32(0);
charSB = rdr.GetSqlBytes(1);
charB = charSB.Value;
stringByte1252s.Add(new StringByte1252(id,charB));
}
rdr.Close();
这有效
select top 10000 [ID], cast(Rtrim([word]) as binary(4)), len([word])
from [FTSwordDef] with (nolock) order by [word]
但是我不能传递len([word])作为二进制的大小
Varbinary抛出相同的错误
以下抛出错误
msg 102,Level 15,State 1,Line 1
'('附近的语法不正确。
Msg 319,Level 15,State 1,Line 2
关键字'with'附近的语法不正确。如果这个陈述是 公用表表达式,xmlnamespaces子句或更改跟踪 context子句,前一个语句必须以a结尾 分号。
select top 10000 [ID], cast(Rtrim([word]) as binary( len([word]) )), len([word])
from [FTSwordDef] with (nolock) order by [word]
答案 0 :(得分:2)
来自MS页面:http://msdn.microsoft.com/en-gb/library/ms188362(v=sql.105).aspx
“当在数据定义或变量声明语句中未指定n时,默认长度为1.如果未使用CAST函数指定n,则默认长度为30.”
您需要指定强制转换中的长度以避免默认值为30 - 如果预先知道长度或者可能会有所不同,请使用大小值的varbinary或甚至varbinary(max) - 这还可以防止不必要的填充值,因为二进制是一个固定的宽度字段。
答案 1 :(得分:1)
由于您正在读取.net中的变量,我建议不要在SQL中将其转换为二进制文件。相反,将其作为字符串读取,因为这是原始列。将它作为字符串后,您可以使用System.Text.Encoding类获取所需代码页的字节数。可用的代码页列在我链接的文档页面的底部。
代码可能如下所示:
SqlCommand sqlCmd = sqlCon.CreateCommand();
byte[] charB;
Int32 id;
sqlCmd.CommandText = "select [ID], Rtrim([word]), [word] " +
"from [FTSwordDef] with (nolock) order by [word];";
SqlDataReader rdr = sqlCmd.ExecuteReader();
while (rdr.Read())
{
id = rdr.GetInt32(0);
charB = System.Text.Encoding.GetEncoding(1252).GetBytes(rdr.GetString(1));
stringByte1252s.Add(new StringByte1252(id,charB));
}
rdr.Close();