如何将动态SQL结果作为参数传递给DBCC命令?

时间:2018-11-26 11:27:34

标签: sql sql-server-2008

我正在尝试使用动态SQL获取数据库日志名称,并将该结果传递给DBCC shrinkfile(@log, 5)。但是日志并没有缩水。我收到查询结果,说不存在日志文件或该文件已移动。

下面的代码正在打印结果:

use master
declare @test nvarchar(255)
declare @search nvarchar(10) = 'log'

SET @test = 'select Name
             from sys.database_files 
             where name like '''+'%' +@search+ '%' + ''''

EXECUTE sp_executesql @test

PRINT @test 

但是此代码抛出错误:

use master
declare @test nvarchar(255)
declare @search nvarchar(10) = 'log'

SET @test = 'select Name
             from sys.database_files 
             where name like '''+'%' +@search+ '%' + ''''

EXECUTE sp_executesql @test

DBCC SHRINKFILE(@test, 5)

1 个答案:

答案 0 :(得分:1)

您需要为select的输出设置一个名称。假设有一个匹配的名称,然后尝试以下版本:

declare @sql nvarchar(255);
declare @search nvarchar(10) = 'log';
declare @name sysname;

set @sql = '
select @name=Name
from sys.database_files
where name like ''%' +@search+ '%''
'
exec sp_executesql @sql, N'@name sysname output', @name=@name output;

select @name;

在您的版本中,您将exec的输出与print混淆了。 print没有任何结果。