我的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下拉列表中当前选定的数据库
答案 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