小编Ale*_*lex的帖子

SQL INSERT INTO WITH SELECT查询

没有经验的SQL,我希望有人可以帮助我.

我有一个空的临时表,以及一个包含信息的表.

我的查询概述如下:

CREATE TABLE [#Temp] (ID Int, Field1 Varchar)

INSERT INTO [#Temp]
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...)
Run Code Online (Sandbox Code Playgroud)

所以我将一大堆ID传递给查询,并且ID对应于ID Other_table,它必须使用此信息填充临时表.

是否可以在同一查询中保存与其他位置不匹配的ID(比如另一个临时表)?或者对于相同的临时表,在这种情况下只有Field1 = NULL?

我需要对未匹配的ID做额外的工作,所以我需要在某处随时访问它们.我希望在这一个查询中完成所有操作,如果这是最快的方法.

编辑:

谢谢你的帮助.

道歉,我现在看到我的问题并不完全清楚.

如果Other_table包含ID 1 - 1000,并且我传入ID 999,1000和1001,我希望临时表包含999和1000的信息,然后还有ID为1001且Field1 = NULL的条目.我不希望ID 1 - 998与Field1 = NULL一起返回.

sql sql-server select insert-into

8
推荐指数
1
解决办法
4961
查看次数

密码和Delphi TZipFile

Delphi XE5 TZipFile能够处理加密/密码保护的zip文件吗?或者用户必须使用第三方软件来处理此问题吗?

任何帮助,将不胜感激.

delphi zip firemonkey delphi-xe5

6
推荐指数
1
解决办法
3304
查看次数

将NULL值传递给参数化的delphi SQL Server查询

我试图将空值传递给TSQLDataset参数.查询具有以下形式:

Query_text:='MERGE INTO [Table] 
             USING (VALUES (:A,:B)) AS Source (Source_A, Source_B)
             ....
             WHEN MATCHED THEN 
             UPDATE SET A = :A
             WHEN NOT MATCHED THEN
             INSERT(A, B) VALUES (:A,:B);

SQL_dataset.CommandType:=ctQuery; 
SQL_dataset.CommandText:=Query_text;

SQL_dataset.ParamByName('A').AsString:='A';  
SQL_dataset.ParamByName('B').AsString:={ COULD BE NULL, OR A STRING };    

SQL_dataset.ExecSQL;
Run Code Online (Sandbox Code Playgroud)

参数B可以为空,但也是外键.如果用户在此字段中输入内容,则必须根据另一个表中的值验证B. 如果它是空白,那么我希望它被忽略.我正在传递'',但这显然会产生FK违规错误.

我试过了:

SQL_dataset.ParamByName('B').Value:=Null;
Run Code Online (Sandbox Code Playgroud)

..但后来我得到一个"dbexpress驱动程序不支持tdbxtypes.unknown数据类型"错误.

我也尝试过:

SQL_dataset.ParamByName('B').DataType:=ftVariant;
SQL_dataset.ParamByName('B').Value:=Null;
Run Code Online (Sandbox Code Playgroud)

..但后来得到"dbexpress驱动程序不支持tdbxtypes.variant数据类型"错误.

不知道我做错了什么,任何帮助将不胜感激.我目前正在根据字符串是否填充来绘制参数列表,这样做效果很好; 它只是有点笨重(在我的实际查询中),因为有很多参数需要验证.

我正在使用Delphi XE4和SQL Server 2012.

更新:

感谢所有的帮助,你的建议一直都是正确的,这是产生'dbexpress驱动'错误的其他因素.为了解决我的问题,我正在创建一个"灵活的"参数列表,这导致了异常:

Parameter_string:='';

If B<>'' then Parameter_string:='B = :B,'

Query_text:='MERGE ...'
            '...'
            'UPDATE SET A = :A, '+Parameter_string+' C = :C' ....
Run Code Online (Sandbox Code Playgroud)

...这个想法是,如果B为空,那么参数将不会在查询中"列出".

这不起作用,或者我的实现不起作用(不知道为什么,我显然在某个地方错过了一步).

无论如何,工作代码: …

sql-server delphi parameterized-query delphi-xe4

5
推荐指数
1
解决办法
9954
查看次数

FireDAC 数据访问组件比 DBExpress 慢?

我已将 Delphi XE5 应用程序中的数据库访问组件从 DBExpress 迁移到 FireDAC。

所以在我使用 TSQLConnection/TSQLDataSet 的地方,我现在使用 TFDConnection/TFDQuery。

到目前为止,我的观察是,使用 FireDAC 组件将 125 000 行数据(通过简单的 SELECT * 查询)从云中的 SQL Server 2014 数据库返回到客户端应用程序所需的时间大约是使用 DBExpress 组件的两倍。

当我在同一个表上运行相同的测试时,应用程序和 SQL 服务器在同一台机器上,FireDAC 组件稍微快一点。

这是正常的,还是我可能做错了什么?我对 FireDAC 组件不是很熟悉,所以任何指针都会非常有帮助。

DBExpress 代码:

SQL_dataset:=TSQLDataSet;

....

SQL_dataset.CommandType:=ctQuery; 
SQL_dataset.CommandText:='SELECT * FROM TABLE';

SQL_dataset.Open;

If SQL_dataset.IsEmpty=False then 
begin 
  SQL_dataset.First;

  While not SQL_dataset.Eof do 
  begin
    { RETURN THE RECORDS }
    SQL_dataset.Next;  
  end;
end;
Run Code Online (Sandbox Code Playgroud)

FireDAC 代码:

SQL_query:=TFDQuery;

...

SQL_query.SQL.Text:='SELECT * FROM TABLE';
SQL_query.Open;
Run Code Online (Sandbox Code Playgroud)

...然后根据 DBExpress 代码。

根据在线研究,我尝试了以下变体,但似乎没有什么区别:

SQL_query.ResourceOptions.ParamCreate  :=False;
SQL_query.ResourceOptions.ParamExpand  :=False;
SQL_query.ResourceOptions.MacroCreate  :=False; …
Run Code Online (Sandbox Code Playgroud)

sql-server delphi dbexpress delphi-xe firedac

5
推荐指数
0
解决办法
3581
查看次数

Delphi TIdHTTP POST不编码加号

我在表单上有一个TIdHTTP组件,并且正在向基于云的服务器发送http POST请求。除1个字段外,其他所有东西都运行良好:带有加号的文本字符串(例如“ hello world + dog”)被保存为“ hello world dog”。

研究此问题后,我意识到URL中的“ +”被视为空格,因此必须对其进行编码。这就是我感到难过的地方;看起来除“ +”外,其余POST请求均由TIdHTTP组件编码。

通过Fiddler查看请求,它以“ hello%20world + dog”的形式出现。如果我手动编码“ +”(hello world%2Bdog),则结果为“ hello%20world%252Bdog”。

我真的不知道我在这里做什么,所以如果有人可以向我指出正确的方向,将不胜感激。

其他信息:

我正在使用Delphi2010。该组件没有任何特殊设置,我想可能需要设置一些内容?Fiddler中出现的标头内容类型为“ application / x-www-form-urlencoded”。

然后,Delphi代码:

Request:='hello world+dog';
URL    :='http://............./ExecuteWithErrors';

TSL:=TStringList.Create;
TSL.Add('query='+Request);

Try
begin
  IdHTTP1.ConnectTimeout:=5000;
  IdHTTP1.ReadTimeout   :=5000;

  Reply:=IdHTTP1.Post(URL,TSL);
Run Code Online (Sandbox Code Playgroud)

delphi http-post delphi-2010 idhttp

2
推荐指数
1
解决办法
1203
查看次数