SQL-Server Varchar 的大小

Posted

技术标签:

【中文标题】SQL-Server Varchar 的大小【英文标题】:Size of SQL-Server Varchar 【发布时间】:2019-05-08 08:08:24 【问题描述】:

这是我获取用于通过 ODBC 访问的 SQL-Server 表的 varchar 字段大小的函数:

Function fn_field_size(par_tab, par_field As Variant) As Variant

    Dim db_tab As DAO.Database
    Dim tab_tab As DAO.TableDef
    Dim tab_field As DAO.field

    fn_field_size = 0

    Set db_tab = CurrentDb()
    Set tab_tab = db_tab.TableDefs(par_tab)
    Set tab_field = tab_tab.Fields(par_field)
    fn_field_size = tab_field.Size

    Set tab_tab = Nothing
    Set db_tab = Nothing

End Function

在我将该函数用于 varchar(1000) 字段之前,它似乎工作正常。在这种情况下,tab_field.Size 为 0。对于 Varchar(100) 等较小的字段,该函数可以正常工作并返回 100。

这是为什么?

【问题讨论】:

DAO 是必需的吗?我会尝试看看 ADO 是否更有意义。也就是说,根据documentation,您从DAO.Field.Size 获得的值是最大 大小,以字节为单位。由于 Access Text 字段最多只能包含 255 个字符(510 个字节?),我怀疑 DAO 可能将 varchar(1000) 视为一些 Memo 字段,其中 Field.Size 始终为 0。你会得到什么对于varchar(510)varchar(512) @MathieuGuindon 是正确的,Access 数据库引擎会将 255 个字符或更少的字符解释为 Text(或在较新版本中为 Short Text)以及更多为 Memo(或在较新版本中为 Long Text) )。数据访问库 (DAO/ADO) 对此没有发言权,因为 Access 数据库引擎将如何使用其数据类型系统解释链接表。 我不确定是否需要 DAO。 DAO 和 ADO 有什么区别?我可以只在这个函数中使用 ADO 吗? 相当肯定跳过链接表/访问内容并打开带有连接字符串的Recordset 直接到 SQL Server,将为您提供正确的元数据。 Access 没有VARCHAR(1000) 字段的概念。所有文本字段均为 UTF-16,所有接受超过 255 个字符的字段都被解释为 Long Text。您需要在服务器上查找字段大小,并且可以使用 ADOX 来完成。我可以写一个答案,但通常你希望有可重用的逻辑来设置 ADODB 连接。您还可以使用直通查询从 SQL Server 查询信息。 【参考方案1】:

正如其他人所指出的,ODBC 将超过 255 个字符的 varchar、nvchar、char 视为“备忘录”类型列,因此您无法获得最大字符数。

假设您在 Access 中定义了传递查询。 (我总是制作一个,并在所有代码中一遍又一遍地重复使用它),然后您可以使用此代码获取任何字段的长度:

Public Function GetFLength(strTable As String, strField As String) As Long

   Dim strSQL     As String

   strSQL = "select col_LENGTH('" & strTable & "','" & strField & "')"

   With CurrentDb.QueryDefs("qryPassR")
      .SQL = strSQL
      GetFLength = .OpenRecordset()(0)
   End With

End Function

对于 varchar(max),上面将返回 -1,但对于其他任何内容,它将返回列的长度。

【讨论】:

以上是关于SQL-Server Varchar 的大小的主要内容,如果未能解决你的问题,请参考以下文章

sql-server:“,”附近的语法不正确

在SQL语句中怎样对varchar型别的列进行数值大小的比较

SQL-server'WEEKDAY'不是公认的内置函数名称[关闭]

Oracle 中 varchar2 PL/SQL 子程序参数的大小限制是多少?

SQL Server 2012 中的最大行大小与 varchar(max) 字段

MySql 性能问题与 SQL-Server