没有经验的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一起返回.
Delphi XE5 TZipFile能够处理加密/密码保护的zip文件吗?或者用户必须使用第三方软件来处理此问题吗?
任何帮助,将不胜感激.
我试图将空值传递给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为空,那么参数将不会在查询中"列出".
这不起作用,或者我的实现不起作用(不知道为什么,我显然在某个地方错过了一步).
无论如何,工作代码: …
我已将 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) 我在表单上有一个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 ×4
sql-server ×3
dbexpress ×1
delphi-2010 ×1
delphi-xe ×1
delphi-xe4 ×1
delphi-xe5 ×1
firedac ×1
firemonkey ×1
http-post ×1
idhttp ×1
insert-into ×1
select ×1
sql ×1
zip ×1