我正在尝试开发一个将运行 CREATE PROCEDURE 脚本的小应用程序。一个简单的例子:
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'ap_get_roles_in_system')
BEGIN
DROP Procedure [dbo].[ap_get_roles_in_system]
END
GO
CREATE PROCEDURE [dbo].[ap_get_roles_in_system]
(
@system_id int
)
AS
SELECT * FROM roles
GO
GRANT EXEC ON [dbo].[ap_get_roles_in_system] TO PUBLIC
GO
如果我将此文本加载到一个字符串中,并通过 ExecuteNonQuery() 运行它,则删除存储过程的第一个项目可以正常工作,但不是运行 Create,而是使用存储的参数发现语法错误程序,即:尚未声明。
简而言之,它不是尝试运行 CREATE,而是以某种方式尝试将脚本作为脚本运行,而不是 CREATE。不知道正确的措辞是什么。
如果粘贴到 Sql Management Studio 中,上面的脚本效果很好。
这是我正在执行的代码:
public string RunSql(string Sql)
{
string result = string.Empty;
_conn.Open();
SqlCommand cmd = new SqlCommand(Sql, _conn);
cmd.CommandType = CommandType.Text;
try
{
cmd.ExecuteNonQuery();
result = "Succeeded";
}
catch (SqlException ex)
{
result = ex.Message;
}
return result;
}