sql server string concat使用'+'

时间:2014-05-26 13:15:04

标签: sql sql-server tsql

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时,转换失败。

2 个答案:

答案 0 :(得分:2)

我不完全确定您要实现的目标(因为您只会打印DBCC命令)。

但由于您的问题标题是关于连接字符串,因此问题在于:space_used_mbDECIMAL,您需要将其转换为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服务器不必要工作。不好不好。