寻找解决方案的SQL新手。我们有一个客户端数据库,其中一个字段称为CLOSED。如果它包含一个值,则它已关闭,否则为空。在搜索过程中不会显示已关闭的案例,除非我运行单独的查询来显示它们。因此,当我运行搜索但没有显示任何内容时,我会在DELPHI应用程序上选择另一个按钮来显示已结案案例。我希望一个按钮选项能够搜索一个案例,如果没有找到,自动继续或重复搜索,以显示已结案的案例。不确定执行此操作的SQL查询是什么。但是我相信我在正确的地方提前拿到了answer......Thanks……
发布于 2016-07-20 01:15:28
一种方法是在您的Delphi应用程序中创建一条SQL语句并将其发送到服务器。如果我正确理解了您的需求,那么只需要一条SQL语句,即使有两种情况需要考虑: a)所有客户端都关闭,b)一些客户端不关闭。但是,当您在Delphi应用程序中构造SQL时,您需要意识到Sql Injection的风险-请参阅https://en.wikipedia.org/wiki/SQL_injection。
一种更好的方法是在服务器上定义一个Stored Procedure来检索所需的数据行。例如,在MS Sql Server中,可以创建如下所示的Stored Procedure
create procedure GetClients as
if (select count(*) from Clients where Closed is Null) > 0
select * from Clients where Closed is Null
else
select * from Clients基本上,if ...条件询问是否有任何行的关闭id为空。如果有,则第一个select ...语句返回它们;如果没有,则返回所有行。
您可以从Delphi应用程序执行它,如下所示
type
TForm1 = class(TForm)
ADOStoredProc1: TADOStoredProc;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
procedure FormCreate(Sender: TObject);
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
AdoStoredProc1.ProcedureName := 'GetClients;1';
AdoStoredProc1.Open;
end;(顺便说一句,要实现这一点,您需要在对象检查器中为AdoStoredProc1设置一个合适的ConnectionString。
请注意,此示例应用程序不会在Delphi应用程序中构造any SQL,因此不存在Sql Injection的风险。
您没有说明您关闭的列是什么数据类型。为了进行测试,我假设它是一个整型列,但任何其他类型都可以。
上面的应用程序特意是极简主义的,基本上是为了说明你可以在服务器端代码中做这样的事情。在实践中,您可能需要对Stored Proc进行参数化,以便可以根据其他列值限制结果。
https://stackoverflow.com/questions/38462889
复制相似问题