当在TSQL或PLSQL之类的东西中编写数据库查询时,我们通常可以选择使用游标迭代行来完成任务,或者制作一个同时执行相同作业的单个SQL语句.
此外,我们可以选择简单地将大量数据拉回到我们的应用程序中,然后使用C#或Java或PHP或其他任何方式逐行处理.
为什么使用基于集合的查询更好?这个选择背后的理论是什么?什么是基于游标的解决方案及其关系等效的一个很好的例子?
我有一个应用程序,它使用游标从sqlite数据库中的rawQuery选择数据,以填充Android中的ListView; 每次用户点击listview项时,我都会创建一个新的Activity实例来重新填充listview.呼叫cursor.close()和db.close()避免记忆问题更好吗?我实际上db.close()参与OnDestroy()了我的活动.
Emacs的hl-line-mode正是我需要的,但我想改变它的可怕的黄色,任何人都知道我该怎么做?
我有这个触发器:
CREATE TRIGGER CHECKINGMAXQTYDAYSVACANCY
ON TDINCI
AFTER INSERT
AS
DECLARE
@incidentCode int,
@dateStart datetime,
@dateEnd datetime,
@daysAccumulated int,
@maxDaysAvailable int
set @daysAccumulated = 0;
select @incidentCode = CO_INCI from inserted;
select @maxDaysAvailable = IN_DIAS_GANA from TCINCI
where CO_INCI = @incidentCode;
declare detailsCursor CURSOR FOR
select FE_INIC, FE_FINA from TDINCI
where CO_INCI = @incidentCode;
open detailsCursor;
if CURSOR_STATUS('variable', 'detailsCursor') >= 0
begin
fetch next from detailsCursor
into @dateStart, @dateEnd;
while @@FETCH_STATUS = 0
begin
set @daysAccumulated = @daysAccumulated + (DATEDIFF(DAY, @dateStart, …Run Code Online (Sandbox Code Playgroud) 我有时会在logcat输出中看到此错误,
Cursor: invalid statement in fillWindow().
Run Code Online (Sandbox Code Playgroud)
当我按下后退键然后listview在转到我的自定义之前它进入默认的Android时,有时会发生这种情况listview.
这是什么意思?我该如何解决?因为它没有指向问题来自的任何代码行.
我想从SQLite查询返回的Cursor中获取一个整数,但我知道整数可能为null.不幸的是我找不到允许我检查这个的任何Cursor方法.
代码将是
mModifiedDate = cursor.getInt(cursor.getColumnIndex(MODIFIED_DATE));
Run Code Online (Sandbox Code Playgroud)
我希望有一个可能的空值,这实际上是出于各种原因所希望的 - 字段是指第二个表被修改的时间,第一个表可以在第二个表之前填充.不幸的是,Cursor的文档说,无论是抛出异常,还是返回错误值,还是其他行为都留给实现,而SQLiteCursor文档没有说明任何内容.
如果该字段为空,此代码将执行什么操作?有没有办法在调用getInt()之前检查这个?
我注意到在尝试运行总查询时,有时估计的计划只显示"获取查询"

并且实际计划显示了聚集索引扫描的重复提取

在其他场合(例如,当向TOP查询添加a时),估计的计划显示填充工作表的"人口查询"阶段

实际计划显示聚集索引扫描以填充工作表,然后重复搜索该工作表.

(额外的问题:如果有人能够解释为什么第一个查询中的每个扫描都算作2个逻辑读取,这可能也很有启发性)
我在这里找到了这篇文章,它解释了FAST_FORWARD游标可以使用动态计划或静态计划.在这种情况下,第一个查询似乎是使用动态计划,第二个查询是静态计划.
我也发现,如果我尝试
SET @C2 = CURSOR DYNAMIC TYPE_WARNING FOR SELECT TOP ...
Run Code Online (Sandbox Code Playgroud)
光标被隐式转换为keyset游标,因此很明显TOP动态游标不支持该构造,也许是出于Ruben的答案的原因 - 仍在寻找对此的明确解释.
但是我还读到,动态游标往往比它们的静态对应物(源1,源2)慢,这似乎让我感到惊讶,因为静态变种必须读取源数据,复制它,然后读取副本而不仅仅是读取源数据.我前面提到的文章提到了动态游标的使用.谁能解释一下这些是什么?它只是一个RID或CI键,还是不同的东西?markers
SET STATISTICS IO OFF
CREATE TABLE #T ( ord INT IDENTITY PRIMARY KEY, total INT, Filler char(8000))
INSERT INTO #T (total) VALUES (37),(80),(55),(31),(53)
DECLARE @running_total INT,
@ord INT,
@total …Run Code Online (Sandbox Code Playgroud) 将光标保持打开被称为不良做法.但是当你忘记关闭和/或解除分配时会发生什么?它如何影响SQL Server,连接/会话?使用游标的查询,存储过程和触发器的后果是否有任何差异?
我已经创建了一个ListView,它由查询返回的数据填充.
它有效,但在LogCat中我收到了消息:
Cursor Window: Window is full: requested allocation 444 bytes, free space 363 bytes, window size 2097152 bytes
Run Code Online (Sandbox Code Playgroud)
它使用几分钟来加载/可视化ListView.
我的查询返回大约3700行String/Int/Double,每行包含30列; 没有图像或特定数据类型
这条消息究竟意味着什么,我该如何避免呢?
您可以通过更改此光标窗口来提高性能吗?
我无法在Git-Bash命令行输入任何字符; 它显示的是一个闪烁的光标.Git Bash昨天工作正常,但我现在无法做任何事情.我该怎么做才能解决这个问题?