【问题标题】:How to prompt an SQL query user to input information如何提示 SQL 查询用户输入信息
【发布时间】:2015-06-25 13:34:35
【问题描述】:

我在 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 的值?除了我只是有评论行告诉他们这样做吗?

【问题讨论】:

  • 如果用户输入'drop database databaseName'会很有趣。制作一个将提示用户输入的应用程序...
  • 这很有趣,但很明显是谁干的,所以我不担心会发生这种情况。什么样的应用程序?我唯一真正的编码知识是基本的 SQL。
  • 不,这是不可能的。 SQL Server 不是前端。它是一个数据库服务器。这不是访问。如果你想要一个提示,它必须来自一个应用程序。
  • 好的,谢谢。有什么建议我应该从哪里开始?

标签: sql-server variables command-prompt prompt


【解决方案1】:

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

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'

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

【讨论】:

  • 非常感谢!这似乎是最好的解决方案。
  • 如果您指示用户右键单击存储过程并单击“执行存储过程...”,那么将通过一个漂亮的 GUI 窗口提示用户查看并输入存储过程所需的所有参数程序。 stackoverflow.com/a/52107123/8595398
【解决方案2】:

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

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

【讨论】:

  • 我正在通过 AnySQL Maestro 为数据库运行此查询,是否可以在该程序中使用另一种语言?如果是这样,我愿意尝试。只是我唯一真正的编码知识是 SQL,而且非常有限
  • @samhatcher 您所需要的只是一种具有 SQL Server 驱动程序的语言,这将是最现代的语言。 AnySQL Maestro 只是一个用于连接和查询数据库的工具,因此不会影响您选择的语言。
【解决方案3】:

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

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

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

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

不涉及纸张和印刷。事实上,SSRS 专门研究一个报表钻入另一个报表,为下一个查询传递起始值。

【讨论】:

  • 事实上,SSRS 甚至愿意根据接受的答案使用您在过渡期间创建的存储过程;-)
【解决方案4】:

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

Stackoverflow Topic

【讨论】:

    【解决方案5】:

    我使用 TOAD for SQL Server,您可以在其中将“运行时输入字段”定义为脚本的一部分。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多