declare @temp_table table(name varchar(100),space_used_mb int,ln int identity(1,1))
insert into @temp_table select name,
convert(decimal(12,2),round(fileproperty(a.name,'SpaceUsed')/128.000,2))as [SPACE_USED_MB]
from dbo.sysfiles a
select 'dbcc shrinkfile(' + name + space_used_mb + ')' from @temp_table
我正在尝试为辅助文件生成动态脚本,但是我收到了以下错误
Msg 245,Level 16,State 1,Line 8
将varchar值')'转换为数据类型int时,转换失败。
答案 0 :(得分:2)
我不完全确定您要实现的目标(因为您只会打印DBCC命令)。
但由于您的问题标题是关于连接字符串,因此问题在于:space_used_mb
是DECIMAL
,您需要将其转换为VARCHAR
(或NVARCHAR
在连接它之前的值。
...
select 'dbcc shrinkfile(' + name + CONVERT(VARCHAR(50), space_used_mb) + ')' from @temp_table
此外,要有一个"有效的" DBCC SHRINKFILE命令,您还缺少逗号:
...
select 'dbcc shrinkfile(' + name + ',' + CONVERT(VARCHAR(50), space_used_mb) + ')' from @temp_table
答案 1 :(得分:1)
也试试这个..
declare @temp_table table
(
name varchar(100),
space_used_mb DECIMAL(10,2),
ln int identity(1,1)
);
insert into @temp_table (name, space_used_mb)
select name,
convert(decimal(12,2)
,round(fileproperty(a.name,'SpaceUsed')/128.000,2))as [SPACE_USED_MB]
from dbo.sysfiles a
select 'DBCC shrinkfile(' + name +','
+ CAST(space_used_mb AS NVARCHAR(100))
+ ')'+ CHAR(10) +'GO' from @temp_table
<强> RESULT 强>
DBCC shrinkfile(master,2.94)
GO
DBCC shrinkfile(mastlog,0.68)
GO
注意强>
为什么你会这么缩小你的日志文件?这是一个糟糕的坏非常糟糕的做法,这意味着每次sql server想要写日志时,最终都会增加日志文件的大小,只是为了写几个日志,并且会创建新的VLF,最终会有数百个的VLF。
默认情况下,如果sql server在日志文件高达64MB时有4个VLF,当logfile大于64MB且小于1GB时有8个VLF,当LogFile超过1GB时有16个VLF。
如果日志文件的大小不够并且你已经允许自动增长,那么当需要写日志并且文件不够大时,Sql Server将增加logfile的大小。这将在每次增加时创建新的VLF日志文件的大小。你想避免这种情况。管理较少的日志文件与管理100s日志文件相比,您正在使您的SQL服务器不必要工作。不好不好。