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






3.50/5 (2投票s)
从 .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 NULLS
和 QUOTED 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();
您可以从页面顶部的链接下载完整的示例项目。