65.9K
CodeProject 正在变化。 阅读更多。
Home

从代码修改视图、触发器和存储过程

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (2投票s)

2019年9月30日

CPOL

2分钟阅读

viewsIcon

5660

downloadIcon

110

从 .NET 代码读取和/或修改数据库对象,例如视图、触发器、存储过程和函数。

引言

.NET SQLClient 库包含许多有用的属性和方法,用于从 SQL 数据库读取、写入和删除数据,以及读取基本的模式信息,例如数据库、表和其他对象的名称。 如果您曾经使用 SQL Management Studio 创建或更改视图、触发器、存储过程或函数,您可能想知道如何在运行时从代码管理此任务。

这个小技巧将向您展示一种简单的方法来读取、修改和更新所有这些数据库对象,这些对象在 SQL Management Studio 中表示为 SQL 脚本。

Using the Code

上述所有数据库对象都作为 SQL 脚本存储在一个名为 [all_sql_modules] 的系统表中。 借助另一个包含常规对象属性(如名称和类型)的系统表,我们可以使用其名称和类型请求所需对象的脚本。

SELECT m.[definition]
     , m.[uses_ansi_nulls]
     , m.[uses_quoted_identifier]
  FROM [sys].[all_sql_modules] m
    INNER JOIN [sys].[objects] o ON o.[object_id] = m.[object_id]
 WHERE (o.name = '<ObjectName>')
   AND (o.[type] = '<ObjectType>');

[definition] 将包含完整的、可直接使用的 SQL 脚本,用于 CREATE 该对象,接下来的两个位列将包含标志,指示在创建或修改该对象时是否应使用 ANSI NULLSQUOTED IDENTIFIERS 的约束。

此示例中支持的对象类型如下:

  • V = 数据库视图
  • T = 表触发器
  • P = 存储过程
  • F = 标量函数
  • TF = 表值函数

在下一步中,对象脚本可以通过代码自动修改,或者(如附件示例项目所示)加载到编辑器中,让用户进行更改。

修改后,可以使用 SQL command 对象的 ExecuteNonQuery 方法将脚本保存到数据库。 因此,我们需要将对象脚本开头的 CREATE 关键字替换为 ALTER(以简单地更新数据库中的对象脚本),并在执行 update 命令之前执行约束(如果需要)。

SqlCommand objCommand = new SqlCommand();

objCommand.Connection = Connection;
objCommand.CommandType = CommandType.Text;
objCommand.CommandTimeout = 30;

if (bolAnsiNulls)
{
    objCommand.CommandText = "SET ANSI_NULLS ON;";
    objCommand.ExecuteNonQuery();
}

if (bolQuotedIdentifier)
{
    objCommand.CommandText = "SET QUOTED_IDENTIFIER ON;";
    objCommand.ExecuteNonQuery();
}

objCommand.CommandText = ObjectScript;
objCommand.ExecuteNonQuery();

您可以从页面顶部的链接下载完整的示例项目。

© . All rights reserved.