列出列依赖项

itz*_*Paz -5 foreign-key sql-server metadata sql-server-2012 dependencies

我想将表列的数据类型从varchar(x)更改为varchar(y)

为此,我需要知道此列有哪些依赖项。

有什么建议?

Aar*_*and 5

SQL Server 元数据之外的很多东西可能取决于列的大小,甚至都不好笑。以下是您需要检查的一些事项:

  • 存储过程、动态 SQL 或临时 SQL 中的任何变量或参数声明,可以将值传递到该列、对其进行过滤、从中搜索或从中获得分配。
  • 触发器、检查约束、默认约束等中对列的任何引用。
  • 用于连接INNOT INEXISTSNOT EXISTSEXCEPTUNION、 等的任何相关列。
  • 任何隐式依赖于旧长度的 T-SQL 代码,例如LEFT(some_string, old_length).
  • 客户端应用程序代码中直接或间接指示字符串长度的任何变量或参数声明。
  • 任何在自己的机器上定期创建临时代码并“记住”该列长度的用户。

我将假定您的varchar(x)列不是键并且未声明为唯一的(如果是,您还可以检查sys.foreign_keys对它们的任何引用)。

请注意,如果您使列更大,则当前假定旧长度的任何代码可能仍然可以正常工作而不会出错。假设 X 是 10,Y 是 20。假设 10 的旧代码可能会这样说:

DECLARE @foo VARCHAR(10) = '01234567890123456789';
PRINT @foo;
Run Code Online (Sandbox Code Playgroud)

结果:

0123456789
Run Code Online (Sandbox Code Playgroud)

无声截断,没有错误。同样的:

CREATE PROCEDURE dbo.foo 
  @foo VARCHAR(20) -- correct length
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @variable VARCHAR(10); -- old length
  SET @variable = @foo;
  PRINT @variable;
END
GO
Run Code Online (Sandbox Code Playgroud)

抱歉,没有什么神奇的查询可以为您收集所有这些内容。您将需要手动检查引用此表的任何代码。至少在 SQL Server 存储过程中,这应该很容易:

SELECT [schema] = s.name, [object] = o.name, o.[type_desc]
  FROM sys.objects AS o
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  INNER JOIN sys.sql_expression_dependencies AS d
  ON o.[object_id] = d.referencing_id
  WHERE d.referenced_schema_name = N'dbo'
    AND d.referenced_entity_name = N'table_that_contains_this_column';
Run Code Online (Sandbox Code Playgroud)

这完全忽略了应用程序代码,以及使用动态 SQL 构建的任何代码,以及间接基于该列的任何代码。不要忘记 SSIS 包、SSRS 报告等,它们也可能对这个长度进行了硬编码。