如何提示 SQL 查询用户输入信息

How to prompt an SQL query user to input information

我在 SQL 服务器上写了一个查询,主要由不认识 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 的值?除了我只是让评论行告诉他们这样做吗?

您能否使用其他编程语言调用此查询? SQL 对您描述的任务无效。 Python/Java/C# 等高级语言可以让您轻松提示用户输入,并且可以说更适合这项工作。

如果您真的想在 SQL 中做某事并且他们正在使用 SSMS,那么您可以使用 SSMS templates 并让用户使用 CTRL+SHIFT+M 输入参数值,尽管我不鼓励这种方法。

如果你不能做一个应用程序,你没有开发人员等等,你有一个方法 - 制作一个存储过程:

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

拒绝用户的任何 activity 权限,但 运行 此过程除外。像这样执行:

exec spDoSomeJob  @amon = '05', @invdate = '05/31/2015'

至少您可以确定没有用户偶尔会损坏某些东西...如果您不为存储过程的参数提供值,它会提示您这样做,除非您没有这些参数的默认值。在我看来,这似乎是您案例的最佳解决方法。

正如其他人所提到的,SQL Server 和 Management Studio 并非旨在用作最终用户工具。

由于您使用的是 SQL SERVER,因此您有一个名为 SQL Server Reporting Services (SSRS) 的工具(可能尚未安装和配置)。

能够提示用户输入参数值。

您的查询进入报表设计器,@变量成为报表过滤器(非常自动),您可以制作一些漂亮的布局。

不涉及纸张和打印。事实上,SSRS 擅长将一个报告钻入另一个报告,为下一个查询传递起始值。

另一种解决方案是使用 PowerShell 要求用户输入,然后将该数据传递给您的脚本,因为它是 PowerShell 运行。在用户的计算机上,您可能需要安装一些 PowerShell 扩展,以便它们 运行 TSQL。像导入模块 sqlps。 PowerShell 不适合胆小的人,但它是免费的,因此您可以免费试用。

Whosebug Topic

我将 TOAD 用于 SQL 服务器,您可以在其中将 "runtime input fields" 定义为脚本的一部分。

select * from myTable AS m where m.ID = :MyValue

:MyValue 是您的参数,当 TOAD 运行 SQL 命令时,它会提示用户即时输入一个值。很遗憾 SSMS 没有提供此功能。