我在SQL server中编写了一个查询,该查询将主要由不了解SQL的人运行,每次运行查询时,有两个区域必须输入不同的字符串或日期。到目前为止,我只是编写了它,以便您在查询的顶部输入信息,并将其存储为变量。有没有一种方法可以让SQL提示运行查询的人输入数据?以下是我所说的代码的摘录。
declare
/*ENTER ACCOUNTING MONTH*/
@amon VARCHAR(2) = '05',
/*ENTER INVOICE DATE IN MM/DD/YYYY FORMAT*/
@invdate DATE = '05/31/2015'
~~
rest of the code
~~
declare @sumA numeric(25, 5), @sumB numeric(25, 5), @ratio numeric(25, 5)
select @sumA = sum(amnt) from accnt where accno = '1152'
select @sumB = sum(amnt) from acc1152
update acc1152 set amnt = amnt * (@sumA/@sumB),
amon = @amon,
invdate = @invdate,
ven = '1152',
code = '1152',
invno = 'INVENTORY'
那么SQL是否可以提示用户键入@amon和@invdate的值?除了我只是在评论线上告诉他们这样做?
如果你不能做一个应用程序,你没有开发人员等,你有一种方法-制作一个存储过程:
create stored procedure spDoSomeJob
@amon VARCHAR(2),
@invdate DATE
as
begin
~~
rest of the code
~~
declare @sumA numeric(25, 5), @sumB numeric(25, 5), @ratio numeric(25, 5)
select @sumA = sum(amnt) from accnt where accno = '1152'
select @sumB = sum(amnt) from acc1152
update acc1152 set amnt = amnt * (@sumA/@sumB),
amon = @amon,
invdate = @invdate,
ven = '1152',
code = '1152',
invno = 'INVENTORY'
end
拒绝用户的任何活动权限,仅运行此过程除外。执行方式:
exec spDoSomeJob @amon = '05', @invdate = '05/31/2015'
至少你会确信没有用户可以偶尔破坏一些东西。。。如果您不为存储过程的参数提供值,它将提示您执行此操作,除非您没有这些参数的默认值。在我看来,这是解决你的案子的最好办法。
您可以从其他编程语言调用此查询吗?SQL对您所描述的任务无效。像Python/Java/C#这样的高级语言可以让您轻松地提示用户输入,并且可以说更适合这份工作。
如果你真的想在SQL中做一些事情,而他们正在使用SSMS,那么你可以使用SSMS模板,让用户使用CTRL+SHIFT+M输入参数值,尽管我不赞成这种方法。
我使用TOAD for SQL Server,您可以在其中定义"运行时输入字段"作为脚本的一部分。
即
select * from myTable AS m where m.ID = :MyValue
:MyValue
是您的参数,当TOAD运行SQL命令时,它将提示用户动态输入值。很遗憾SSMS没有提供此功能。
正如其他人所提到的,SQL Server和Management Studio不是最终用户工具。
由于您使用的是SQL SERVER,因此您有一个名为SQL SERVER Reporting Services(SSRS)的工具(可能尚未安装和配置)。
它确实能够提示用户输入参数值。
您的查询进入报表设计器,@variables变成报表过滤器(非常自动),您可以做出一些不错的布局。
不涉及纸张和印刷。事实上,SSRS专门处理一个报告钻取另一个报告,为下一个查询传递起始值。
另一种解决方案是使用PowerShell请求用户输入,然后在PowerShell运行脚本时将数据传递给脚本。在用户的计算机上,您可能需要安装一些PowerShell扩展,以便它们运行TSQL。类似于导入模块sqlps。PowerShell不适合胆小的人,但它是免费的,所以你可以在没有大量承诺的情况下尝试它。
堆栈溢出主题