SQL Server错误“SQL Server子查询返回超过1个值”

时间:2016-12-28 12:40:24

标签: sql-server-2012 subquery syntax-error

<!-- if version -->

查询以更改恢复模型并将自动增长设置为50 MB

USE MASTER   
GO    
SET QUOTED_IDENTIFIER ON  
GO  
SET ARITHABORT ON  
GO  

除了系统数据库之外,还要使用所有数据库。

DECLARE @DBName NVARCHAR(255),@LogicalFileName NVARCHAR(255),@DBRecoveryDesc Varchar(200), @isql varchar(2000)

DECLARE DatabaseList CURSOR   
FOR   
SELECT name,recovery_model_desc  
FROM sys.databases  
WHERE state_desc = 'ONLINE'  
AND is_read_only = 0  
and database_id>4  
ORDER BY name  

在子查询下方面临错误

OPEN DatabaseList  
FETCH NEXT FROM DatabaseList INTO @DBName,@DBRecoveryDesc  
WHILE @@FETCH_STATUS = 0     
BEGIN   
SET @LogicalFileName=(SELECT name FROM sys.master_files AS mf WHERE DB_NAME(database_id)=@DBName and type_desc='log' ) 

If @DBRecoveryDesc='Full'  
Begin  
select @isql = 'Use ['+@DBName+'] 
ALTER DATABASE ['+@DBName+'] SET RECOVERY SIMPLE WITH NO_WAIT
ALTER DATABASE ['+@DBName+'] MODIFY FILE (NAME = N'''+@LogicalFileName+''', FILEGROWTH = 50)'  

脚本将提供输出脚本     --exec(@isql)     打印(@isql)     结束

If @DBRecoveryDesc='Simple'  
Begin   
select @isql = 'Use ['+@DBName+'] 
ALTER DATABASE ['+@DBName+'] MODIFY FILE (NAME = N'''+@LogicalFileName+''', FILEGROWTH = 50)' 

--exec(@isql)
print(@isql)
END
FETCH NEXT FROM DatabaseList INTO @DBName,@DBRecoveryDesc
END  
CLOSE DatabaseList  
DEALLOCATE DatabaseList

请帮我改变子查询的详细信息

1 个答案:

答案 0 :(得分:0)

问题在于您的子查询:

SELECT name 
FROM sys.master_files AS mf 
WHERE DB_NAME(database_id) = @DBName
AND type_desc = 'log'

返回多条记录(因为@DBName命名的数据库有多个日志文件),因此您无法将@LogicalFileName设置为此子查询的结果 - 我认为@LogicalFileName是字符串类型,如VARCHARNVARCHAR

您需要更改子查询,以便它只返回单个值,或更改@LogicalFileName变量的类型,以便可以处理多个结果(例如,将其声明为类型{{1 }})。