是否可以(仅使用T-SQL没有C#代码)编写存储过程来执行一系列其他存储过程而不传递任何参数?
我的意思是,例如,当我想更新表中的一行并且该表有很多列都是必需的时,我想运行第一个存储过程来检查{{1是否存在,如果是,那么我想调用更新存储过程,传递ID
但是(使用SQL Server管理器在执行每个存储过程后显示的窗口)从用户获取其余值。
当我使用ID
命令时,我需要传递所有参数,但有没有其他方法来调用存储过程而不传递这些参数? (在C#或VB中很容易,我的意思是只使用SQL语法)
答案 0 :(得分:2)
我认为你在问:"你能在sql脚本中提示用户输入吗?"。不,不是真的。
你可以通过对Windows API的严重黑客调用实际做到这一点。它几乎肯定会有严重的安全问题。
但不要这样做。用C#,VB,Access,Powerscript,Python或其他任何让你开心的程序编写程序。使用适合任务的工具。
- 已添加</ p>
只是让你知道这会有多丑。想象一下,使用Flash组件作为ActiveX对象并使用Flash收集用户的输入 - 现在您正在谈论它将会是什么样的黑客攻击。编写CLR过程等等就像黑客一样。
你现在应该畏缩。但是它变得更糟,如果TSQL在sql server上运行,它可能会在服务器控制台上提示或崩溃而不是在你的工作站上运行。你现在肯定应该购买。
如果您来自Oracle Accept,那么等同于TSQL中不可用 - 也不应该是,并且可能永远不会。
答案 1 :(得分:1)
您可以通过在@符号前面添加参数名称来指定参数。例如,您可以像这样调用SP:
EXEC MyProc @Param1='This is a test'
但是,如果你问你是否可以逃避不提供所需的参数,答案是否定的。需要是必需的。您可以通过在SP的声明中提供默认值来使它们成为可选项。然后你可以不传递值或像这样调用它:
EXEC MyProc @Param1=DEFAULT
--OR
EXEC MyProc DEFAULT
答案 2 :(得分:1)
现在,在阅读您的评论后,我可以理解您正在尝试做什么。您希望调用过程,然后要求最终用户传递参数值。
这是一个非常非常糟糕的方法,特别是因为您已经提到过您将使用此SP对数据库进行更改。
在调用数据库之前,您应该从最终用户获取所有值(执行过程),然后只调用数据库,您可以尽快打开事务并提交它或RollBack并退出那里。因为它会锁定你的资源。
想象一下你打电话给数据库(执行sp),sp继续并打开一个事务,然后等待最终用户传递值,你的最终用户决定去点香烟,这会让你的资源被锁定并且您必须自己进入并终止该进程,以便让其他用户去使用数据库/行。
在应用程序级别(C#,VB)获取来自最终用户的所有值,并且只有当您拥有所有必需信息时,才将这些值传递给sp,执行它并尽快离开。