带变量的游标 - 不会停止执行 - SQL Server

时间:2017-04-19 15:31:13

标签: sql-server tsql

有一个存储过程,假设要获取超过24小时的登录信息并删除它。我添加了一个游标来遍历master.sys.sql_logins,以便它获取所有需要删除的登录。

然而,当我运行这个存储过程时,它永远不会停止执行,它只返回一个登录,当它假设返回两个时,如下所示:

enter image description here

不确定为什么会这样,但这是脚本:

BEGIN

DECLARE @RandomChar VARCHAR(2)
DECLARE @DropTemp   NVARCHAR(500)

--Grabs the last two right characters where login name is older than 24 hours
DECLARE RandomChar_Cursor CURSOR FOR 
    SELECT RandomChar = RIGHT(RTRIM(name), 2) FROM master.sys.sql_logins WHERE name LIKE '%tempIMPLUSER%' AND create_date > DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) -1, 0)

OPEN RandomChar_Cursor

FETCH NEXT FROM RandomChar_Cursor INTO
    @RandomChar

WHILE @@FETCH_STATUS = 0

    BEGIN

        SET @DropTemp = 'DROP LOGIN tempIMPLUser' + @RandomChar
        print @droptemp
            --EXEC sp_executesql @DropTemp

    END

CLOSE RandomChar_Cursor
DEALLOCATE RandomChar_Cursor

END

3 个答案:

答案 0 :(得分:2)

您还需要在循环内以及循环开始之前运行从游标中获取下一个值。

将您的循环更改为:

python main.py

答案 1 :(得分:2)

你不需要光标。通过使用动态sql来管理这种类型的管理,你可以这么简单。编码更容易,并且不需要循环的所有复杂性。一旦你满意动态sql字符串是正确的,你可以简单地取消注释exec行。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'DROP LOGIN ' + name + ';' 
FROM master.sys.sql_logins 
WHERE name LIKE '%tempIMPLUSER%' 
AND create_date > DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) -1, 0)

select @SQL
--exec sp_executesql @SQL

答案 2 :(得分:0)

为了避免写两个fetch语句(以及将来改变):

"import time
 import multiprocessing
 import numpy as np
 import threading
 add_result = [] 
 a = np.random.rand(10000000)
 b = np.random.rand(10000000)
 def calc_add(numbers):
 global add_results
 for n in numbers:
    print('add' + str(a+b)) 
    add_result.append(a+b)
    print('within a process result' +str(add_result))
    time.Time = start_time
if __name__=="__main__":
arr = a+b
p1 = multiprocessing.Process(target = calc_add, args = (arr))
p2 = multiprocessing.Process(target = calc_add, args = (arr))
p1.start()
p2.start()
p1.join()
p2.join()

print("result" +str(add_result))
print("done!")