代码之家  ›  专栏  ›  技术社区  ›  corymathews

syscomments表使用多行。为什么?

  •  4
  • corymathews  · 技术社区  · 14 年前

    我在写一个不断给我错误的剧本。在对它进行跟踪之后,我发现syscomments表将其内容存储在多行中,如果这些信息超过了varchar(8000),我相信。

    为什么syscomments表将数据分成多行而不是一个更大的行?性能?

    3 回复  |  直到 14 年前
        1
  •  11
  •   Community kfsone    7 年前

    syscomments.text nvarchar(4000)是否记录在这里: sys.syscomments (Transact-SQL) ,这是你一天中所能做的最好的。

    但是,您可以使用较新的 sys.sql_modules 记录在这里: sys.sql_modules (Transact-SQL) ,它有一个 definition 列是 nvarchar(max) .

    搜索使用:

    DECLARE @Search nvarchar(500)
    SET @Search=N'your text here'
    SELECT DISTINCT
        o.name AS Object_Name,o.type_desc --, m.definition
        FROM sys.sql_modules        m 
            INNER JOIN sys.objects  o ON m.object_id=o.object_id
        WHERE m.definition Like '%'+@Search+'%'
        ORDER BY 2,1
    

    如果您是SQL Server 2005之前的用户,则可以使用以下查询进行搜索: SQL server table population source

        2
  •  3
  •   Raj More    14 年前

    存储过程、视图等的代码存储在comments字段中。此列是varchar类型。varchar的限制是8000。

    所以如果你有一段超过8000个字符的代码,它必须被分解成多行。

    这不会更改为文本或blob,因为我们在此列上进行搜索。不能对该文本数据类型执行许多字符串函数来搜索、替换等操作,因此将其保留为varchar。

    在这里查找有关搜索syscomments的示例

    http://codebank.wordpress.com/2007/03/06/search-stored-procedures-for-text-with-sp_grep/

        3
  •  2
  •   Remus Rusanu    14 年前

    sys.syscomments 与所有目录元数据视图一样,是 看法 不是桌子。您可以查看实际视图定义:

    sp_helptext 'sys.syscomments'
    

    您将看到对象定义的实际文本是通过对内部行集(即 关系式 操作员)。因此,基表中没有多行,定义只是动态地拆分成多行,这样一个大文本模块就可以显示为多个nvarchar(4000)chunck。

    另一方面,如果检查另一个视图的定义 sys.sql_modules :

    sp_helptext 'sys.sql_modules'
    

    您将看到模块文本是通过 标量 功能 OBJECT_DEFINITION .

    一般来说,将一个字段拆分成多行对性能没有任何好处。