我正在尝试使用游标来清理不再需要的临时表。我有一个小表,其中包含临时表的名称和标识符。游标陷入无限循环,但前提是我在其中执行某些语句。如果我只是打印出 中的值FETCH,它就可以完美运行。这是代码。
DECLARE @id bigint;
DECLARE @table_name varchar(max);
DECLARE st CURSOR LOCAL FAST_FORWARD FOR
SELECT ID, TableName FROM SearchTables WHERE CustomerID IS NULL
OPEN st
FETCH NEXT FROM st INTO @id, @table_name
WHILE @@FETCH_STATUS <> -1
BEGIN
IF(OBJECT_ID(@table_name) IS NOT NULL)
EXEC('DROP TABLE ' + @table_name);
UPDATE SearchTables SET Deleted=1 WHERE ID=@id;
PRINT CAST(@id AS varchar(max)) + ' ' + @table_name;
FETCH NEXT FROM st INTO @id, @table_name;
END
CLOSE st
DEALLOCATE st
Run Code Online (Sandbox Code Playgroud)
如果我注释掉这些行
IF(OBJECT_ID(@table_name) IS NOT NULL) …Run Code Online (Sandbox Code Playgroud) 我性能调优Dynamics AX的应用程序,看到一个SQL跟踪长时间运行,高I / O查询的形式exec sp_cursorexecute 1073742882 ...。当我尝试运行在一个新的SQL Management Studio中的窗口,查询,我得到一个错误Could not find prepared statement with handle 1073742882.我”我不确定,但似乎缓存计划是特定于连接的。我无sp_cursorprepare迹可寻;重复用例会显示相同的准备好的句柄 ID 和新游标。由于它是我要连接的共享环境,因此我想我必须重置应用服务器并跟踪其启动才能看到它。
dm_exec_cached_plans与这个游标相关联?dm_exec_query_plan或其他方式查看执行计划?我有一些业务部门,如印度、国际、美国、英国。
我必须:
SP_Report结果集匹配的列创建表变量(虚拟内存表)SP_Report并将数据插入到表变量中代码:
declare @K table (BU nvarchar(max), K nvarchar(max),Y money, A money, D money, YP money)
declare @FY int
declare @BU nvarchar(max)
INSERT INTO @K (BU, K, Y, A, D, YP)
EXEC dbo.SP_Report '2012', 'India'
SELECT * FROM @K
Run Code Online (Sandbox Code Playgroud)
此代码返回表变量的结果。现在我必须使用它游标,我不知道如何使用。我怎样才能解决同样的问题。
我正在执行一个遍历游标结果的循环。代码位于触发器函数中,重要的部分如下所示:
编辑:对不起,愚蠢的错误。删除“one_table”后执行触发器。这与我在触发器代码中执行“删除”或“更新”操作的表不同(参见下面的第二个清单)
create trigger my_trigger after delete on one_table
for each row
begin
declare my_value int;
declare num_rows int default 0;
declare done int default false;
declare my_cursor cursor for select value from table where condition;
declare continue handler for sqlstate '02000' set done = 1;
open my_cursor;
select found_rows() into num_rows;
-- This is just for debugging
insert into log_table(key, value) values('foo', num_rows);
if num_rows > 0 then:
repeat
fetch my_cursor into my_value;
-- Do stuff
until done …Run Code Online (Sandbox Code Playgroud) 我们有一个在 SQL Server 2008 R2 上运行的第三方会计系统。要将发票插入这个会计系统,我们必须使用它附带的 API(它只是一组加密的 SP)。
我们的一些批处理需要插入大量(1,000 张)发票。所以,通常在 SQL 中你会写一个 INSERT 语句,它们会很快被插入。
但是,因为我们必须使用 SP 来插入行,所以我们目前有一个 C# 应用程序,它运行一个 PARALLEL FOR 循环并在每次迭代中调用一次 SP。
性能不是很好,虽然这很大程度上取决于 API SP 内部发生的事情,但我想知道 SQL Server 是否可以为我做些什么来提高性能。我知道我可以摆脱 C# 应用程序并在 T-SQL 中使用 CURSOR,但据我所知,这不会并行运行 - 对吗?
同样,我可以动态生成数千条 SQL 语句来调用具有不同参数的 SP,我想优化器可以看到加密的 SP 在做什么(当然比 C# 应用程序更好)并提出一个计划将尽可能多地并行运行它们。
以下文档描述了如何查看从函数返回的 refcursor,这里,如下所示:
CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
BEGIN
OPEN $1 FOR SELECT col FROM test;
RETURN $1;
END;
' LANGUAGE plpgsql;
BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN funccursor;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
这对我有用。但是,如果我想将结果保留在我的屏幕上,我必须保持事务处于打开状态。当我执行 COMMIT 时,我的结果集被丢弃。当我同时执行 FETCH 和 COMMIT 时,第一个结果集被丢弃。
有没有办法提交事务但保留结果集?PgAdmin 的版本是 1.18.1。
我想从返回 SYS_REFCURSOR 类型值的函数中进行选择。
例如 :
CREATE OR REPLACE FUNCTION my_funtion (
my_param IN VARCHAR2)
RETURN SYS_REFCURSOR
IS
l_return SYS_REFCURSOR;
BEGIN
OPEN l_return FOR
SELECT last_name, first_name
FROM employees
WHERE id = my_param
ORDER BY employee_id;
RETURN l_return;
END my_funtion;
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情:
select * from my_function('id015');
Run Code Online (Sandbox Code Playgroud)
甚至 :
select alias.last_name from my_function('id015') alias;
Run Code Online (Sandbox Code Playgroud) 静态游标不允许修改数据,因为它是只读的,并且当使用“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) cursors ×10
sql-server ×2
t-sql ×2
mysql ×1
oracle ×1
parallelism ×1
pgadmin ×1
plsql ×1
postgresql ×1
select ×1
trigger ×1
update ×1