【发布时间】:2018-06-06 14:38:56
【问题描述】:
我有以下 C# 代码应该允许我修改(更改)我的存储过程:
SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString);
ServerConnection srvCon = new ServerConnection(sqlCon);
sqlCon.Open();
Server srv = new Server(srvCon);
Database db = srv.Databases[sqlCon.Database];
StoredProcedure sp = new StoredProcedure(db, "spRDLDataFetcher");
sp.TextMode = false;
sp.AnsiNullsStatus = false;
sp.QuotedIdentifierStatus = false;
sp.TextBody = "SELECT blah FROM MyTable WHERE ID=1";
sp.Alter();
但是,sp.Alter()call 会引发此错误:
Microsoft.SqlServer.Management.Smo.FailedOperationException:'StoredProcedure 'dbo.spRDLDataFetcher' 的更改失败。 '
内部异常:InvalidSmoOperationException:您无法对处于Creating 状态的对象执行Alter 操作。
为了让它改变(更新)该存储过程,我缺少什么?
【问题讨论】:
-
放弃 SMO 可以节省大量时间和麻烦,只需使用 SqlClient 发送一个完整的“ALTER PROCEDURE”批处理。
-
idownvotedbecau.se/noresearch。我敢肯定,对于之前的 750 多个问题,您已经听过一两次:您尝试过什么? Google 的第一个命中建议调用
Refresh()来同步 SQL 和 SMO 对象的状态(即告诉 SMO 它实际上是一个现有的 SP)。 -
你不是说
sp = db.StoredProcedures["spRLDataFetcher"]吗?我相信另一种选择是在new之后立即调用sp.Refresh(),这样SMO 就会意识到它已经存在。 (尽管我在这里完全同意@David 的观点——每次我使用 SMO 时,最终都会遇到比其价值更多的麻烦,即使对于它名义上应该擅长的任务也是如此。) -
无法执行@DavidBrowne-Microsoft 的建议,因为我只是在 SP 中更改了一些内容。我正在用数据替换 cmets (--something)。上面的 textBody= 只是一个示例,并不是我将要更改的真实 SP。
-
即使以编程方式替换存储过程主体,
SELECT [definition] FROM sys.sql_modules WHERE object_id = OBJECT_ID('myprocedure')也可以。给文字打补丁,把第一个CREATE换成ALTER,发回去。但是 SMO 在所需的代码行数方面做得稍微好一些。
标签: c# sql sql-server stored-procedures sql-server-2014