更改游标中的DB不会持久存在

时间:2014-10-08 11:31:32

标签: sql sql-server loops cursor

我的SQL:

SET NOCOUNT ON;

DECLARE @sql NVARCHAR(4000)
DECLARE @dbs CURSOR 
DECLARE @name NVARCHAR(100)
DECLARE @type NVARCHAR(100)
DECLARE @results TABLE (Name VARCHAR(MAX), Type VARCHAR(MAX))

SET @dbs = CURSOR FAST_FORWARD FOR SELECT name FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb')

-- go through each db
OPEN @dbs
FETCH NEXT FROM @dbs INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'Use [' + @name + ']; PRINT DB_NAME();'
    exec sp_sqlexec @sql

    -- execute a query in the current db
    SELECT @type = ...; -- get a scalar value
    PRINT DB_NAME();

    -- insert the result into a list which is built up gradually
    insert into @results (Name, Type) VALUES (@name, @type)
    FETCH NEXT
    FROM @dbs INTO @name
END

CLOSE @dbs
DEALLOCATE @dbs

-- send back the list which got its results from all dbs
SELECT Name, Type FROM @results

第一个和第二个PRINT DB_NAME();打印不同的名称,为什么?

示例消息(为清晰起见添加了新行):

DB1
DB0

DB2
DB0

DB3
DB0

DB0
DB0

DB4
DB0

DB0是SSMS下拉列表中当前选定的数据库

1 个答案:

答案 0 :(得分:0)

此行为不是由光标引起的,而是由sp_sqlexec设计的行为引起的 Changes in database context last only to the end of the sp_executesql statement.
对于EXEC,可以找到相同的内容 Changes in database context last only until the end of the EXECUTE statement