按顺序调用一系列存储过程SQL



是否有可能(仅使用T-SQL而不使用c#代码)编写一个存储过程来执行一系列其他存储过程而不传递任何参数?

我的意思是,例如,当我想更新表,表中的一行的列有很多都是必需的,我想先运行存储过程检查如果ID存在与否,如果是的,那么我想调用update存储过程,通过ID但(使用SQL Server的窗口管理器显示执行每个存储过程后)从用户得到其余的值。

当我使用EXEC命令时,我需要传递所有参数,但是有没有其他方法可以在不传递这些参数的情况下调用存储过程?(很容易在c#或VB中做到,我的意思是只使用SQL语法)

我想你是在问"你能在sql脚本中提示用户输入吗?"没有。

你可以通过调用Windows API来实现。而且几乎肯定会有严重的安全问题。

但是不要这样做。用c#、VB、Access、Powerscript、Python或任何你喜欢的语言写一个程序。使用适合任务的工具。

——添加

让你知道这会有多难看。想象一下,使用Flash组件作为ActiveX对象,并使用Flash收集来自用户的输入——现在你正在谈论的是黑客攻击。编写CLR进程等也同样是一项大工作。

你现在应该畏缩。但更糟糕的是,如果TSQL在sql服务器上运行,它可能会在服务器控制台上提示或崩溃,而不是在工作站上运行。你现在肯定是在畏畏缩缩了。

如果您是从Oracle Accept来的,那么在TSQL中不应该有等效的

读完你的评论后,我现在可以理解你想做什么了。您希望调用过程,然后要求最终用户为Parameters传递值。

这是一个非常非常糟糕的方法,特别是因为你已经提到你将使用这个SP对数据库进行更改。

在你调用数据库(执行过程)之前,你应该从你的最终用户那里得到所有的值,只有这样,你才能调用数据库,打开一个事务,并尽快提交或回滚,然后离开那里。因为它会锁住你的资源。

想象一下,你调用数据库(执行sp), sp继续并打开一个事务,现在等待最终用户传递值,你的最终用户决定离开一个cig,这将使你的资源被锁定,你将不得不自己进入并杀死进程,以便让其他用户去使用数据库/行。

解决方案

在应用程序级别(c#,VB)从最终用户获取所有值,只有当您拥有所有所需信息时,才将这些值传递给sp,执行它并尽快离开那里。

您可以通过在参数名称前加上@符号来指定参数。例如,您可以像这样调用SP:

EXEC MyProc @Param1='This is a test'

但是,如果你问你是否可以不提供必要的参数,答案是否定的。必需就是必需。您可以通过在SP声明中提供默认值来使它们成为可选的。然后您可以不传递该值,也可以像这样调用它:

EXEC MyProc @Param1=DEFAULT
--OR
EXEC MyProc DEFAULT

最新更新