静态游标不允许修改数据,因为它是只读的,并且当使用“Where current of”执行时,它会按预期返回错误。到目前为止,一切都很好。但我惊讶地发现静态游标允许使用这样的变量修改数据。
DECLARE @nome varchar(100), @salario int,@idemp int
DECLARE contact_cursor CURSOR STATIC FOR
SELECT empno,ename, sal FROM emp
OPEN contact_cursor;
FETCH NEXT from contact_cursor into @idemp,@nome, @salario
WHILE @@FETCH_STATUS=0
BEGIN
If @salario < 5000
Update Emp
Set Sal = Sal * 1.1
where empno=@idemp --No error and do the update
--Where current of contact_cursor; --gives error
print @nome+' '+cast(@salario as varchar(100));
Run Code Online (Sandbox Code Playgroud)
FETCH NEXT from contact_cursor into @idemp,@nome, @salario
END
CLOSE contact_cursor;
DEALLOCATE contact_cursor;
Run Code Online (Sandbox Code Playgroud)
问题是:在这次更新中使用“where current”和用光标提取的变量有什么区别? 我发现数据库兼容性级别之间的一段代码的行为存在差异,并想知道其原因是什么。下面是一个简单的示例,它迭代计数表并ROWCOUNT在第 50 次迭代时更改选项:
设置:
/* Create tally table */
SELECT TOP 100
ROW_NUMBER() OVER (ORDER BY a.object_id) AS Number
INTO #Tally
FROM sys.objects a
CROSS JOIN sys.objects b;
/* Create Some databases with different compatibility levels */
CREATE DATABASE [100Compat] WITH COMPATIBILITY_LEVEL = 100
CREATE DATABASE [110Compat] WITH COMPATIBILITY_LEVEL = 110
CREATE DATABASE [120Compat] WITH COMPATIBILITY_LEVEL = 120
CREATE DATABASE [130Compat] WITH COMPATIBILITY_LEVEL = 130
Run Code Online (Sandbox Code Playgroud)
受影响的代码:
/* cursor through the tally table */
DECLARE MyCursor CURSOR
FOR
SELECT …Run Code Online (Sandbox Code Playgroud) 我有一个具有该CURSOR VARYING类型的输出参数的存储过程。我想验证调用存储过程的代码是否可以使用输出游标。这似乎CURSOR_STATUS是正确使用的函数,但将其应用到输出光标时,我得到了意想不到的结果。该函数在创建它的存储过程内返回值 -3,但在存储过程外按预期工作。请参阅下面的代码:
CREATE OR ALTER PROCEDURE dbo.OutputCursorTest
(@Cursor_OUT CURSOR VARYING OUTPUT)
AS
BEGIN
SET NOCOUNT ON;
SET @Cursor_OUT = CURSOR FORWARD_ONLY STATIC FOR
SELECT [high]
from master..spt_values
OPEN @Cursor_OUT;
SELECT CURSOR_STATUS('variable', '@Cursor_OUT'); -- this seems to always return -3
-- possible workaround
/*
DECLARE @Cur_Copy CURSOR;
SET @Cur_Copy = @Cursor_OUT;
SELECT CURSOR_STATUS('variable', '@Cur_Copy');
DEALLOCATE @Cur_Copy;
*/
RETURN;
END;
GO
DECLARE @Cur CURSOR;
EXEC dbo.OutputCursorTest @Cursor_OUT = @Cur OUTPUT;
SELECT CURSOR_STATUS('variable', '@Cur'); -- this returns 1 …Run Code Online (Sandbox Code Playgroud) 我不知道这个问题是否更适合这里或 SO ...
这是我想启动的脚本(该函数的代码是从 SO 上的一个问题复制的):
\c mydb
create or replace function truncate_tables(username in varchar) returns void as $$
declare
stmt RECORD;
statements cursor for select tablename from pg_tables where tableowner = username;
begin
for stmt in statements loop
execute 'truncate table ' || quote_ident(stmt.tablename) || ' CASCADE ;';
end loop;
end;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR: syntax at or near "$1" LINE1: $1
QUERY $1
CONTEXT: SQL statement in PL/PgSQL function "truncate_tables" near line 5
Run Code Online (Sandbox Code Playgroud)
我是 Postgres …
我有一个游标定义为:
DECLARE idCursor CURSOR
FOR SELECT DISTINCT [id], [data]
FROM #tempTable
Run Code Online (Sandbox Code Playgroud)
我有一个变量定义为:
DECLARE @currentId TABLE (
[id] int,
[data] char(1)
);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将下一个结果提取到 @currentId
FETCH NEXT FROM idCursor INTO @currentId
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Must declare the scalar variable "@currentId".
Run Code Online (Sandbox Code Playgroud)
如何在表中获取游标获取的结果?我知道我可以声明两个变量并单独存储结果。但是对于包含许多列的表来说,这将是耗时的。
MSDN 建议@@FETCH_STATUS谨慎使用,因为它是全球性的:
因为@@FETCH_STATUS 对连接上的所有游标都是全局的,所以请谨慎使用@@FETCH_STATUS。执行 FETCH 语句后,必须在针对另一个游标执行任何其他 FETCH 语句之前对 @@FETCH_STATUS 进行测试。
这让我想到两个问题:
@@FETCH_STATUSmyFETCH NEXT和WHILEcondition之间的值?例如,假设另一个游标位于按计划调用的存储过程中。@@FETCH_STATUS有等价于@@IDENTITY's SCOPE_IDENTITY()?我有一个查询,它返回如下输出:
[Location] [Reference] [Year] [Int1] [Int2]
England 1 2015 13 201
England 1 2015 12 57
England 1 2015 4 14
England 2 2015 18 29
England 2 2015 18 29
England 1 2016 32 67
England 1 2016 43 11
England 2 2016 10 56
Run Code Online (Sandbox Code Playgroud)
其中 int1 和 int2 列表示有关位置的一些计算数据。我试图在报告中表示数据并意识到我可以使用表单的 ID 列:
[ID][Location] [Reference] [Year] [Int1] [Int2]
1 England 1 2015 13 201
2 England 1 2015 12 57
3 England 1 2015 4 14
1 England 2 2015 …Run Code Online (Sandbox Code Playgroud) 我想用 PostgreSQL 游标确认一点。
我必须为巨大的结果集查询(超过 1Go 的小重量行)实现一个选择工厂。因此,我已经了解了游标,并按以下方式执行查询:
我创建一个光标:
DECLARE HashedCursorName CURSOR FOR SELECT * FROM BigResultSetQuery;
Run Code Online (Sandbox Code Playgroud)
我重复获取少量结果集:
FETCH 1000 FROM HashedCursorName;
Run Code Online (Sandbox Code Playgroud)
当结果集耗尽时,我关闭游标:
CLOSE HashedCursorName;
Run Code Online (Sandbox Code Playgroud)
我需要解决并发问题,我的意思是,许多用户必须能够同时使用 API 过程中存储的相同查询。当用户执行存储的查询时,他会收到一个新连接。我首先在 API 中修改了我的游标名称,因为我认为如果调用所有选择查询,StaticCursorName我会遇到两个用户试图创建相同游标或读取相同游标的问题。一切都按预期进行。
然后我尝试将光标名称更改为静态名称,它仍然有效。我能够同时运行多个相同的查询。然后我想知道,光标是否绑定到连接?,然后PostgreSQL是通过将游标分配给会话来解决并发的吗?
假设我在 SQL Server 2008 中有一个这样的表:
id | name | qty
-------------------
1 | john | 1
2 | bill | 3
3 | mary | 2
4 | jill | 5
Run Code Online (Sandbox Code Playgroud)
我想查询此表并为每批返回 1 行,最多为 2。因此,查询结果如下所示:
id | name | qty
-------------------
1 | john | 1
2 | bill | 2
2 | bill | 1
3 | mary | 2
4 | jill | 2
4 | jill | 2
4 | jill | 1
Run Code Online (Sandbox Code Playgroud)
这可以在不使用光标的情况下整齐地完成吗?这可以使用 unpivot 吗?
顺便说一下,该 …
我有一个游标,它从一组表中生成一条 JSON 文本记录。光标一直在使 SSMS 崩溃。该脚本运行了一段时间,然后 SSMS 失败。下面是我编写的导致崩溃的代码。
DECLARE @ROW_ID int -- Here we create a variable that will contain the ID of each row.
DECLARE JSON_CURSOR CURSOR -- Here we prepare the cursor and give the select statement to iterate through
FOR
SELECT -- Our select statement (here you can do whatever work you wish)
ROW_NUMBER() OVER (ORDER BY NAME_2-1,NAME_2-2,FIELD_1-1,FIELD_1-2) AS ROWID
FROM
(
SELECT
FIELD_1-1
,FIELD_1-2
,NAME_1-1
,NAME_1-2
FROM
(
SELECT FIELD_1-1,FIELD_1-2,NAME,VALUE
FROM TABLE_1
WHERE NAME IN ('NAME_1-1','NAME_1-2')
) …Run Code Online (Sandbox Code Playgroud) cursors ×10
sql-server ×5
postgresql ×2
t-sql ×2
concurrency ×1
cross-apply ×1
dynamic-sql ×1
json ×1
plpgsql ×1
rank ×1
ssms ×1
unpivot ×1
update ×1