0

Get bytes from a varchar
[word] is 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 Incorrect syntax near '('. Msg 319, Level 15 ,状态 1,第 2 行

关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前面的语句必须以分号结束。

  select top 10000 [ID], cast(Rtrim([word]) as binary( len([word]) )), len([word])
  from [FTSwordDef] with (nolock) order by [word]
4

2 回答 2

2

从 MS 页面: http: //msdn.microsoft.com/en-gb/library/ms188362 (v=sql.105).aspx

“当在数据定义或变量声明语句中未指定 n 时,默认长度为 1。当未使用 CAST 函数指定 n 时,默认长度为 30。”

您需要在强制转换中指定长度以避免默认值 30 - 如果事先不知道长度或可能会发生变化,请使用具有较大大小值的 varbinary 甚至 varbinary(max) - 这也将防止值的不必要填充,因为二进制是一个固定宽度的字段。

于 2013-04-18T17:07:32.947 回答
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();
于 2013-04-18T17:19:10.700 回答