【问题标题】:MS Access: How to find greatest length of all fields?MS Access:如何找到所有字段的最大长度?
【发布时间】:2021-10-06 06:25:34
【问题描述】:

我正在努力将 Access 数据库移至 SQL Server。为此,我需要知道创建 VARCHAR 字段需要多长时间。

我可以在 Access 中使用查询来返回每列值的最长长度吗?

我找到了几个使用 SQL Server 更高级的 T-SQL 的选项,但找不到任何使用 Access 执行此操作的方法。由于数据库有近 200 列,我宁愿不必使用 200 个手动查询来执行此操作。

【问题讨论】:

  • 为什么不直接使用 8000 或最大值?
  • @GordonLinoff - 我们的 IT 部门要求我们为字段设置长度限制。
  • 如果您使用的是 SSMS,您可以使用“建议”选项来识别字段的类型和长度。您也可以使用sql中的函数MAX和LEN来获取​​最大值。
  • @Zayfaya83 - 不幸的是,它只提供了测试数据;他们只需要建立表格,我们将填充真实数据。
  • 我建议对所有列应用 MAX(LEN(column_name)) 的某种组合。这里有一个想法如何在所有列上循环:stackoverflow.com/questions/20463365/…

标签: sql ms-access


【解决方案1】:

Opss.... 抱歉,试试这个 Sub ,希望它对你有更多帮助。

Sub getFieldSize()
Const SQL As String = "SELECT Max(Len([{fld_len}])) AS Expr1 FROM {tbl}"

    Const constPad01 = 25
    Const constPad03 = 45
    Dim db As DAO.Database, tbl As DAO.TableDef, fld As DAO.Field, rs As DAO.Recordset
    Dim sStmt As String, strSchema As String, strSQL As String
    Dim X As Long
    Set db = CurrentDb
    strSchema = "****  " & CurrentDb.Name & "  ****" & vbNewLine
    For Each tbl In db.TableDefs
        If Left(tbl.Name, 4) <> "MSys" Then
            strSchema = strSchema & "===================================" & vbNewLine & vbTab & tbl.Name & vbNewLine
            For Each fld In tbl.Fields
                If Len(fld.Name) > 25 Then
                    sStmt = " " & fld.Name & String(constPad03 - Len(fld.Name), " ")
                Else
                    sStmt = " " & fld.Name & String(constPad01 - Len(fld.Name), " ")
                End If
                Select Case fld.Type
                    Case dbText:
                        strSQL = Replace(SQL, "{fld_len}", fld.Name)
                        strSQL = Replace(strSQL, "{tbl}", tbl.Name)
                        Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
                        If rs.RecordCount > 0 Then X = rs!Expr1
                        Set rs = Nothing
                        sStmt = sStmt & "text length " & " (" & X & ")"
                        X = 0
                    Case dbMemo:
                        strSQL = Replace(SQL, "{fld_len}", fld.Name)
                        strSQL = Replace(strSQL, "{tbl}", tbl.Name)
                        Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
                        If rs.RecordCount > 0 Then X = rs!Expr1
                        Set rs = Nothing
                        sStmt = sStmt & "memo length" & " (" & X & ")"
                        X = 0
                    Case Else:
                        sStmt = ""
                End Select
               If sStmt <> "" Then strSchema = strSchema & sStmt & vbNewLine
            Next
        End If
    Next
    Debug.Print strSchema
    Set db = Nothing
    Open CurrentProject.Path & "\Schema.txt" For Output As #1: Print #1, strSchema: Close #1

End Sub

【讨论】:

  • OP 只需要 varchar 字段的长度。
  • 这给了我定义字段的长度,但不是最长值的长度。
  • 告诉您的 IT 部门对所有变量执行 NVARCHAR(2000),然后您拥有数据并自己制作新表或进行更多测试。如果2000不够,就做3000。也许这是一个实用的解决方案。就像 Gordon Linoff 提到的那样。
  • 你有多少行?您也可以在 excel 中加载它并通过简单的公式获得最大长度,应该在几分钟内完成。
  • 使用定义的长度有什么问题?
【解决方案2】:
SELECT 
Max(Len([Fieldname1])) AS Expr1, 
Max(Len([Fieldname2])) AS Expr2,  
Max(Len([Fieldname3])) AS Expr3 
FROM Tablename;

这将显示表格中每个字段的最大长度。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多